小程序裏沒有FormData
類,因此POST方法若是要傳multipart/form-data就會報錯。javascript
而npm上的formdata-polyfill
,相似 https://github.com/form-data/... 或者https://github.com/jimmywarti...
都很差用java
好在有人探究出來 https://developers.weixin.qq.... 能夠手動拼裝出FormData
格式的字符串,而且成功調用。git
如下附代碼:github
// 手動拼接FormData字符串 // 函數邊界處理沒怎麼作,各位可自行補充 // 數組和obj的狀況沒有處理,能夠用postman發個請求看看格式,很簡單的 function createFormData(params = {}, boundary = '') { let result = ''; for (let i in params) { result += `\r\n--${boundary}`; result += `\r\nContent-Disposition: form-data; name="${i}"`; result += '\r\n'; result += `\r\n${params[i]}` } // 若是obj不爲空,則最後一行加上boundary if (result) { result += `\r\n--${boundary}` } return result } // 通用post請求 export const post = function (url, params) { return new Promise(function (resolve, reject) { // 生成一個boundary字符串 const boundary = `----FooBar${new Date().getTime()}`; const formData = createFormData(params, boundary); console.log(formData); Taro.request({ // 這裏我用的taro,改爲wx.request也同樣 url, method: 'POST', credentials: 'include', //設置傳遞cookies dataType: 'json', header: { 'Accept': 'application/json', 'Content-Type': `multipart/form-data; boundary=${boundary}`, }, data: formData, timeout: 5000, success: function (res) { resolve(res.data); }, fail: function (error) { reject(error); } }) }); }
用postman發個formdata請求,咱們能夠看到數據長這樣:npm
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="mobile" 13800138000 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="name" 張三 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="address" 地球 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="weappid" abcdefghijklmn ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="id" 107 ------WebKitFormBoundary7MA4YWxkTrZu0gW--
仔細觀察如下,就能夠總結出上面的拼裝規則了。
其中,數據體中boundary
,是Content-Type
中的boundary
前面加--
。json
開頭和結尾還有每一個field
之間要加上boundary
小程序