Axios
是一個基於Promise
的 HTTP 庫,能夠用在瀏覽器和node.js
中,由於尤大大的推薦,axios也變得愈來愈流行。最近項目中使用axios也遇到了一些問題,就藉此機會總結一下,若有錯誤,還請不吝指正。node
XMLHttpRequests
請求node
層發起http
請求Promise
API請求
和響應
請求
和響應
數據JSON
數據XSRF(跨站請求僞造)
npmios
npm install axios
git
bowergithub
bower install axios
npm
cdnjson
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
axios
發起請求segmentfault
axios.get('/user?ID=123') .then( res => { // 請求數據成功並返回數據。 console.info(res) }).catch( e => { if(e.response){ //請求已發出,服務器返回狀態碼不是2xx。 console.info(e.response.data) console.info(e.response.status) console.info(e.response.headers) }else if(e.request){ // 請求已發出,但沒有收到響應 // e.request 在瀏覽器裏是一個XMLHttpRequest實例, // 在node中是一個http.ClientRequest實例 console.info(e.request) }else{ //發送請求時異常,捕捉到錯誤 console.info('error',e.message) } console.info(e.config) }) // 等同如下寫法 axios({ url: '/user', method: 'GET', params: { ID: 123 } }).then( res => { console.info(res) }).catch( e => { console.info(e) })
axios.post('/user', { firstName: 'Mike', lastName: 'Allen' }).then( res => { console.info(res) }).catch( e => { console.info(e) }) // 等同如下寫法 axios({ url: '/user', method: 'POST', data: { firstName: 'Mike', lastName: 'Allen' } }).then( res => { console.info(res) }).catch( e => { console.info(e) })
在使用GET
方法傳遞參數時使用的是params
,而且官方文檔中介紹爲:params are the URL parameters to be sent with the request. Must be a plain object or a URLSearchParams object
。譯爲:params
做爲URL連接中的參數發送請求,且其必須是一個plain object
或者是URLSearchParams object
。plain object
(純對象)是指用JSON
形式定義的普通對象或者new Object()
建立的簡單對象;而URLSearchParams object
指的是一個能夠由URLSearchParams接口定義的一些實用方法來處理 URL 的查詢字符串的對象,也就是說params
傳參是以/user?ID=1&name=mike&sex=male
形式傳遞的。瀏覽器
而在使用POST
時對應的傳參使用的是data
,data
是做爲請求體發送的,一樣使用這種形式的還有PUT
,PATCH
等請求方式。有一點須要注意的是,axios
中POST
的默認請求體類型爲Content-Type:application/json
(JSON規範流行),這也是最多見的請求體類型,也就是說使用的是序列化後的json
格式字符串來傳遞參數,如:{ "name" : "mike", "sex" : "male" }
;同時,後臺必需要以支持@RequestBody
的形式接收參數,不然會出現前臺傳參正確,後臺接收不到的狀況。
若是想要設置類型爲Content-Type:application/x-www-form-urlencoded
(瀏覽器原生支持),axios
提供了兩種方式,以下:服務器
瀏覽器端
const params = new URLSearchParams(); params.append('param1', 'value1'); params.append('param2', 'value2'); axios.post('/user', params);
不過,並非全部瀏覽器都支持URLSearchParams
,兼容性查詢caniuse.com,可是這裏有一個Polyfill (polyfill
:用於實現瀏覽器並不支持的原生API的代碼,能夠模糊理解爲補丁,同時要確保polyfill
在全局環境中)。
或者,你也能夠用qs
這個庫來格式化數據。默認狀況下在安裝完axios後就可使用qs
庫。
const qs = require('qs'); axios.post('/user', qs.stringify({'name':'mike'}));
node層
在node
環境中可使用querystring
。一樣,也能夠用qs
來格式化數據。
const querystring = require('querystring'); axios.post('http://something.com/', querystring.stringify({'name':'mike'}));
常見的請求體類型還有一種方式,即multipart/form-data
(瀏覽器原生支持),也就是提交表單數據經常使用的一種格式。和x-www-form-urlencoded
對比起來,後者則是數據被編碼成以 '&' 分隔的鍵-值對, 同時以 '=' 分隔鍵和值。非字母或數字的字符會被Percent-encoding(URL encoding),這也就是爲何這種類型不支持二進制數據的緣由 (應使用 multipart/form-data 代替)。
本文只是總結了axios
中一些經常使用的知識點,也是本人平時在開發中遇到過的問題,因此還有些node層的應用以及其餘使用場景沒有涉及到,更詳細的配置請移步axios官方文檔,另,推薦一篇翻譯不錯的中文文檔axios譯。