fetch(url, { method: 'POST', // or 'PUT' body: JSON.stringify(data), // data can be `string` or {object}! headers: new Headers({ 'Content-Type': 'application/json' // 須要主動設置,而且將object 用JSON.stringify(data)進行轉化 }) })
fetch(url, { method: 'POST', // or 'PUT' body: qs.stringify(data), // 或者將data轉換爲formData格式 headers: new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' // 不進行header設置的默認格式 }) })
因爲 涉及文件上傳,表單的 提交必須採起非編碼格式 即,'content-type':multipart/form-data;boundary=${boundary}
;
${boundary} 爲一分割字符串。可是,重點來了,無論事fetch,仍是rxjs的 ajax 只要主動設置 content-type爲multipart/form-data,不加後面的boundary,會自動加到傳輸的格式中,致使後端取不到值。若是加了boundary,又致使直接formData都取不到值。
最終解決方案就是,content-type不進行設置,只將data改成 formData格式。瀏覽器會自動識別,自動設置爲content-type:multipart/form-data;boundary=隨機值 的形式。最終上傳成功。ios
export const toFormData = (data: Data) => { if (data === null) return null; return Object.keys(data).reduce((formData, item) => { if (item === 'files') { //特殊判斷若是內容爲files數組,就讓裏面值不用走JSON.stringify data[item] && data[item].forEach((curr) => { formData.append('upload_file[]', curr.originFileObj); }); } else { formData.append(item, JSON.stringify(data[item])); } return formData; }, new FormData()); };
遇到要傳JSON值,須要手動設置content-type :application/json;
遇到須要傳遞From URL Encoded 格式 formData, 須要 手動設置 content-type:application/x-www-form-urlencoded ,而且使用 qs.stringify (data) 將data轉換爲url格式,才能正常使用
遇到須要文件流 (Multipart From)格式的formData,須要 手動構建formData 數據 ,(new formData,.append('a',1),...), 而後去掉全部的 content-type設置。也就是 不對content-type進行設置。利用formData直接做爲 post接口的body值,這樣就能正確轉化爲 'content-type':multipart/form-data;boundary=${boundary}
格式。反正在這種狀況下,我實踐只能是什麼都不傳成功了,其餘狀況都失敗了。使用了fetch和 rxjs的ajax,沒有使用axios。ajax