axios傳遞參數傳不過去,小程序post傳參,聊聊axios-axios的介紹以及請求方式
一開始學習(xi)axios時(shi),與后(hou)端(duan)交互用(yong)的是從網(wang)上down下(xia)來封裝好的axios,直接(jie)使用(yong)也并未發現什么問(wen)題。直到有一天自行寫(xie)項目(mu)時(shi),自己封裝了get和post請求,post沒(mei)有問(wen)題,但get請求,后(hou)端(duan)表(biao)示(shi)收不到數據(ju)。那時(shi)的我(wo)一直不明白(bai)個(ge)所以(yi)然,一直認(ren)為(wei)一定是后(hou)端(duan)出(chu)了問(wen)題。后(hou)來查(cha)了很多資料,才(cai)解開這個(ge)謎(mi)團(tuan)。所以(yi)今(jin)天把(ba)axios容(rong)易犯錯的地方寫(xie)下(xia)來,給初學axios的小伙伴(ban)們(men)提個(ge)醒。以(yi)下(xia)部分內容(rong)面試時(shi)可(ke)能(neng)會用(yong)到。
axios的介紹(shao)
axios是通(tong)過Promise實(shi)現對ajax技術的(de)一種封裝,就像(xiang)jquery對ajax的(de)封裝一樣。axios是基于Promise的,因(yin)此可(ke)以使用Promise API。
axios的請求方法(fa)
axios里請求(qiu)參數類型會涉(she)及到兩種,一種是params,一種是data,他們兩個的區別如下:
params 是將與請(qing)求一起發(fa)送的 URL 參數,對應后(hou)端(duan)的query,一般用于get請(qing)求
data 是作為請(qing)求主(zhu)體被發送的數(shu)據(ju),對應后端的body,一般用于post請(qing)求
請求方法(fa):
get
post
put
patch
delete
head
為了方(fang)便起見(jian),axios為所有支(zhi)持的請求方(fang)法提供了別名:
1.axios.get(url[, config])
獲取數據,請求指定的信息,返回(hui)實體對象
只支持 params 傳參
2.axios.post(url[, data[, config]])
向指定資源提交數據(例如表單提交或文件上傳)
同時(shi)支持(chi) data 和 params
3.axios.put(url[, data[, config]])
更新數據,從客戶(hu)端向服務器傳送的(de)數據取代指定(ding)的(de)文檔(dang)的(de)內容
所(suo)有(you)數據推送(song)到(dao)后端
同時(shi)支持 data 和 params
4.axios.patch(url[, data[, config]])
更新數據,是對put方法的補充,用來對已知資源進(jin)行局部(bu)更新
只將更改(gai)的數據(ju)推(tui)送到后端
同時支(zhi)持 data 和 params
5.axios.delete(url[, config])
請求(qiu)服(fu)務(wu)器刪除指定的(de)數據(ju)
只(zhi)支持 params傳參
6.axios.head(url[, config])
獲取報文首(shou)部
只支持 params傳參
我們在開發的時(shi)候,最常(chang)用(yong)的是axios.get和axios.post。通常(chang)我們也只(zhi)有(you)將這兩種(zhong)請(qing)求方式進行(xing)封裝。所以接下來著重介(jie)紹這兩種(zhong)請(qing)求方式。
axios中get和(he)post傳(chuan)參的優缺點:
1.post更安全(quan)
get參數會拼接在url里(li),成為(wei)url里(li)的一部分,安全性(xing)較差;而post的請求數據是放在body中;
get會(hui)被緩存(cun),保存(cun)在服務器(qi)日志以(yi)及瀏(liu)覽器(qi)的瀏(liu)覽記(ji)錄中,而post沒有緩存(cun)。
2.post發送的數據量(liang)更大
get請(qing)求有長(chang)度限(xian)制,一般(ban)是2k,post則(ze)沒有長(chang)度限(xian)制。
3.post能發送更多的數(shu)據類型
get只能(neng)發送ASCII字符(fu),而post能(neng)發送更(geng)多的數據類型
4.post比get慢
一(yi)般情況下是(shi)由于get的緩存(cun)機制導致;
get是向(xiang)服務器(qi)索取數據(ju),post則是向(xiang)服務器(qi)提交數據(ju);
post會比get多(duo)請求一次。
5.post請求(qiu)包含更多的請求(qiu)頭
get 請求(qiu)是將header、data、http打包(bao)成TCP包(bao)發送(song)給(gei)服(fu)務端;post請求(qiu)會產生兩(liang)個(ge)(ge)TCP包(bao),一(yi)個(ge)(ge)用(yong)來存放header信息 一(yi)個(ge)(ge)用(yong)來存放data信息,請求(qiu)時先(xian)給(gei)瀏覽(lan)器發送(song)header包(bao),服(fu)務器響(xiang)應后再發送(song)data包(bao),服(fu)務器響(xiang)應后再返回數據(ju)。
這也是(shi)造成post比get慢(man)的一個原因(yin);
另外(wai)post請求(qiu)因為沒(mei)有長度限制,所以請求(qiu)求(qiu)里可以包含更多的數據。
6.get請(qing)求(qiu)在(zai)瀏覽器(qi)回退時(shi)是無(wu)害的,無(wu)影響(xiang);post請(qing)求(qiu)在(zai)瀏覽器(qi)回退時(shi)則會再次提交(jiao)請(qing)求(qiu)。
最后附上axios的配置項及詳解(jie):
{ // `url` 是用于請求的服務器 URL url: '/user', // `method` 是創建請求時使用的方法 method: 'get', // 默認是 get // `baseURL` 將自動加在 `url` 前面,除非 `url` 是一個絕對 URL。 // 它可以通過設置一個 `baseURL` 便于為 axios 實例的方法傳遞相對 URL baseURL: '//some-domain.com/api/', // `transformRequest` 允許在向服務器發送前,修改請求數據 // 只能用在 'PUT', 'POST' 和 'PATCH' 這幾個請求方法 // 后面數組中的函數必須返回一個字符串,或 ArrayBuffer,或 Stream transformRequest: [function (data) { // 對 data 進行任意轉換處理 return data; }], // `transformResponse` 在傳遞給 then/catch 前,允許修改響應數據 transformResponse: [function (data) { // 對 data 進行任意轉換處理 return data; }], // `headers` 是即將被發送的自定義請求頭 headers: {'X-Requested-With': 'XMLHttpRequest'}, // `params` 是即將與請求一起發送的 URL 參數 // 必須是一個無格式對象(plain object)或 URLSearchParams 對象 params: { ID: 12345 }, // `paramsSerializer` 是一個負責 `params` 序列化的函數 // (e.g. //www.npmjs.com/package/qs, //api.jquery.com/jquery.param/) paramsSerializer: function(params) { return Qs.stringify(params, {arrayFormat: 'brackets'}) }, // `data` 是作為請求主體被發送的數據 // 只適用于這些請求方法 'PUT', 'POST', 和 'PATCH' // 在沒有設置 `transformRequest` 時,必須是以下類型之一: // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams // - 瀏覽器專屬:FormData, File, Blob // - Node 專屬: Stream data: { firstName: 'Fred' }, // `timeout` 指定請求超時的毫秒數(0 表示無超時時間) // 如果請求話費了超過 `timeout` 的時間,請求將被中斷 timeout: 1000, // `withCredentials` 表示跨域請求時是否需要使用憑證 // 打一個比方如果在跨域請求的時候,如果我們需要向后臺發送cookie的情況下,這個時候我們需要將這個字段設置成true withCredentials: false, // 默認的 // `adapter` 允許自定義處理請求,以使測試更輕松 // 返回一個 promise 并應用一個有效的響應 (查閱 [response docs](#response-api)). adapter: function (config) { /* ... */ }, // `auth` 表示應該使用 HTTP 基礎驗證,并提供憑據 // 這將設置一個 `Authorization` 頭,覆寫掉現有的任意使用 `headers` 設置的自定義 `Authorization`頭 auth: { username: 'janedoe', password: 's00pers3cret' }, // `responseType` 表示服務器響應的數據類型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream' responseType: 'json', // 默認的 // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名稱 xsrfCookieName: 'XSRF-TOKEN', // default // `xsrfHeaderName` 是承載 xsrf token 的值的 HTTP 頭的名稱 xsrfHeaderName: 'X-XSRF-TOKEN', // 默認的 // `onUploadProgress` 允許為上傳處理進度事件 onUploadProgress: function (progressEvent) { // 對原生進度事件的處理 }, // `onDownloadProgress` 允許為下載處理進度事件 onDownloadProgress: function (progressEvent) { // 對原生進度事件的處理 }, // `maxContentLength` 定義允許的響應內容的最大尺寸 maxContentLength: 2000, // `validateStatus` 定義對于給定的HTTP 響應狀態碼是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者設置為 `null` 或 `undefined`),promise 將被 resolve; 否則,promise 將被 rejecte validateStatus: function (status) { return status >= 200 && status < 300; // 默認的 }, // `maxRedirects` 定義在 node.js 中 follow 的最大重定向數目 // 如果設置為0,將不會 follow 任何重定向 maxRedirects: 5, // 默認的 // `httpAgent` 和 `httpsAgent` 分別在 node.js 中用于定義在執行 http 和 https 時使用的自定義代理。允許像這樣配置選項: // `keepAlive` 默認沒有啟用 httpAgent: new http.Agent({ keepAlive: true }), httpsAgent: new https.Agent({ keepAlive: true }), // 'proxy' 定義代理服務器的主機名稱和端口 // `auth` 表示 HTTP 基礎驗證應當用于連接代理,并提供憑據 // 這將會設置一個 `Proxy-Authorization` 頭,覆寫掉已有的通過使用 `header` 設置的自定義 `Proxy-Authorization` 頭。 proxy: { host: '127.0.0.1', port: 9000, auth: : { username: 'mikeymike', password: 'rapunz3l' } }, // `cancelToken` 指定用于取消請求的 cancel token // (查看后面的 Cancellation 這節了解更多) cancelToken: new CancelToken(function (cancel) { }) }