node.js中axios使用心得總結(jié)
Axios是一個基于Promise的 HTTP 庫,可以用在瀏覽器和node.js 中,因為尤大大的推薦,axios也變得越來越流行。最近項目中使用axios也遇到了一些問題,就借此機會總結(jié)一下,如有錯誤,還請不吝指正。
功能
瀏覽器端發(fā)起XMLHttpRequests請求
node層發(fā)起http請求
支持Promise API
攔截請求和響應
轉(zhuǎn)換請求和響應數(shù)據(jù)
取消請求
自動轉(zhuǎn)換JSON數(shù)據(jù)
客戶端支持防御XSRF(跨站請求偽造)
兼容
使用
npm
npm install axios
bower
bower install axios
cdn
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
發(fā)起請求
GET
axios.get('/user?ID=123') .then( res => { console.info(res) }).catch( e => { if(e.response){ //請求已發(fā)出,服務器返回狀態(tài)碼不是2xx。 console.info(e.response.data) console.info(e.response.status) console.info(e.response.headers) }else if(e.request){ // 請求已發(fā)出,但沒有收到響應 // e.request 在瀏覽器里是一個XMLHttpRequest實例, // 在node中是一個http.ClientRequest實例 console.info(e.request) }else{ //發(fā)送請求時異常,捕捉到錯誤 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) })
POST
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方法傳遞參數(shù)時使用的是params,并且官方文檔中介紹為:params are the URL parameters to be sent with the request. Must be a plain object or a URLSearchParams object。譯為:params作為URL鏈接中的參數(shù)發(fā)送請求,且其必須是一個plain object或者是URLSearchParams object。plain object(純對象)是指用JSON形式定義的普通對象或者new Object()創(chuàng)建的簡單對象;而URLSearchParams object指的是一個可以由URLSearchParams接口定義的一些實用方法來處理 URL 的查詢字符串的對象,也就是說params傳參是以/user?ID=1&name=mike&sex=male形式傳遞的。
而在使用POST時對應的傳參使用的是data,data是作為請求體發(fā)送的,同樣使用這種形式的還有PUT,PATCH等請求方式。有一點需要注意的是,axios中POST的默認請求體類型為Content-Type:application/json(JSON規(guī)范流行),這也是最常見的請求體類型,也就是說使用的是序列化后的json格式字符串來傳遞參數(shù),如:{ "name" : "mike", "sex" : "male" };同時,后臺必須要以支持@RequestBody的形式接收參數(shù),否則會出現(xiàn)前臺傳參正確,后臺接收不到的情況。
如果想要設置類型為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:用于實現(xiàn)瀏覽器并不支持的原生API的代碼,可以模糊理解為補丁,同時要確保polyfill在全局環(huán)境中)。
或者,你也可以用qs這個庫來格式化數(shù)據(jù)。默認情況下在安裝完axios后就可以使用qs庫。
const qs = require('qs'); axios.post('/user', qs.stringify({'name':'mike'}));
node層
在node環(huán)境中可以使用querystring。同樣,也可以用qs來格式化數(shù)據(jù)。
const querystring = require('querystring'); axios.post('http://something.com/', querystring.stringify({'name':'mike'}));
補充
常見的請求體類型還有一種方式,即multipart/form-data(瀏覽器原生支持),也就是提交表單數(shù)據(jù)常用的一種格式。和x-www-form-urlencoded對比起來,后者則是數(shù)據(jù)被編碼成以 '&' 分隔的鍵-值對, 同時以 '=' 分隔鍵和值。非字母或數(shù)字的字符會被Percent-encoding(URL encoding),這也就是為什么這種類型不支持二進制數(shù)據(jù)的原因 (應使用 multipart/form-data 代替)。
相關(guān)文章
nodejs部署到騰訊云服務器的實現(xiàn)(寶塔面板linux系統(tǒng))
本文主要介紹了nodejs部署到騰訊云服務器的實現(xiàn)(寶塔面板linux系統(tǒng)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEq
這篇文章主要介紹了node項目中遇到使用斷言測試程序,看了下nodejs的api之后,對nodejs中assert斷言的幾個方法做個簡單的記錄,需要的朋友可以參考下2017-09-09node.js多個異步過程中判斷執(zhí)行是否完成的解決方案
這篇文章主要給大家介紹了關(guān)于node.js多個異步過程中判斷執(zhí)行是否完成的幾種解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-12-12Node.js實現(xiàn)用戶評論社區(qū)功能(體驗前后端開發(fā)的樂趣)
這篇文章主要介紹了Node.js實現(xiàn)用戶評論社區(qū)(體驗前后端開發(fā)的樂趣) ,需要的朋友可以參考下2019-05-05基于nodejs+express(4.x+)實現(xiàn)文件上傳功能
通過一段時間的查閱資料發(fā)現(xiàn)實現(xiàn)上傳的方式有:1.express中間件multer模塊2.connect-multiparty模塊(但現(xiàn)在 官方不推薦 )3.使用multiparty模塊實現(xiàn)4.使用formidable插件實現(xiàn),本文給大家介紹nodejs+express(4.x+)實現(xiàn)文件上傳功能,需要的朋友參考下2015-11-11提升node.js中使用redis的性能遇到的問題及解決方法
本文中提到的node redis client采用的基于node-redis封裝的二方包,因此問題排查也基于node-redis這個模塊。接下來通過本文給大家分享提升node.js中使用redis的性能2018-10-10