node.js中axios使用心得總結(jié)
Axios是一個(gè)基于Promise的 HTTP 庫,可以用在瀏覽器和node.js 中,因?yàn)橛却蟠蟮耐扑],axios也變得越來越流行。最近項(xiàng)目中使用axios也遇到了一些問題,就借此機(jī)會(huì)總結(jié)一下,如有錯(cuò)誤,還請不吝指正。
功能
瀏覽器端發(fā)起XMLHttpRequests請求
node層發(fā)起http請求
支持Promise API
攔截請求和響應(yīng)
轉(zhuǎn)換請求和響應(yīng)數(shù)據(jù)
取消請求
自動(dòng)轉(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ā)出,服務(wù)器返回狀態(tài)碼不是2xx。
console.info(e.response.data)
console.info(e.response.status)
console.info(e.response.headers)
}else if(e.request){
// 請求已發(fā)出,但沒有收到響應(yīng)
// e.request 在瀏覽器里是一個(gè)XMLHttpRequest實(shí)例,
// 在node中是一個(gè)http.ClientRequest實(shí)例
console.info(e.request)
}else{
//發(fā)送請求時(shí)異常,捕捉到錯(cuò)誤
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)
})
注意事項(xiàng)
在使用GET方法傳遞參數(shù)時(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ā)送請求,且其必須是一個(gè)plain object或者是URLSearchParams object。plain object(純對象)是指用JSON形式定義的普通對象或者new Object()創(chuàng)建的簡單對象;而URLSearchParams object指的是一個(gè)可以由URLSearchParams接口定義的一些實(shí)用方法來處理 URL 的查詢字符串的對象,也就是說params傳參是以/user?ID=1&name=mike&sex=male形式傳遞的。
而在使用POST時(shí)對應(yīng)的傳參使用的是data,data是作為請求體發(fā)送的,同樣使用這種形式的還有PUT,PATCH等請求方式。有一點(diǎn)需要注意的是,axios中POST的默認(rèn)請求體類型為Content-Type:application/json(JSON規(guī)范流行),這也是最常見的請求體類型,也就是說使用的是序列化后的json格式字符串來傳遞參數(shù),如:{ "name" : "mike", "sex" : "male" };同時(shí),后臺(tái)必須要以支持@RequestBody的形式接收參數(shù),否則會(huì)出現(xiàn)前臺(tái)傳參正確,后臺(tái)接收不到的情況。
如果想要設(shè)置類型為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,但是這里有一個(gè)Polyfill (polyfill:用于實(shí)現(xiàn)瀏覽器并不支持的原生API的代碼,可以模糊理解為補(bǔ)丁,同時(shí)要確保polyfill在全局環(huán)境中)。
或者,你也可以用qs這個(gè)庫來格式化數(shù)據(jù)。默認(rèn)情況下在安裝完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'}));
補(bǔ)充
常見的請求體類型還有一種方式,即multipart/form-data(瀏覽器原生支持),也就是提交表單數(shù)據(jù)常用的一種格式。和x-www-form-urlencoded對比起來,后者則是數(shù)據(jù)被編碼成以 '&' 分隔的鍵-值對, 同時(shí)以 '=' 分隔鍵和值。非字母或數(shù)字的字符會(huì)被Percent-encoding(URL encoding),這也就是為什么這種類型不支持二進(jìn)制數(shù)據(jù)的原因 (應(yīng)使用 multipart/form-data 代替)。
相關(guān)文章
nodejs簡單訪問及操作mysql數(shù)據(jù)庫的方法示例
這篇文章主要介紹了nodejs簡單訪問及操作mysql數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式分析了nodejs創(chuàng)建mysql連接、執(zhí)行sql語句及關(guān)閉連接等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
基于NodeJS+MongoDB+AngularJS+Bootstrap開發(fā)書店案例分析
這章的目的是為了把前面所學(xué)習(xí)的內(nèi)容整合一下,這個(gè)示例完成一個(gè)簡單圖書管理模塊,因?yàn)橹虚g需要使用到Bootstrap這里先介紹Bootstrap2017-01-01
node創(chuàng)建Vue項(xiàng)目步驟詳解
在本篇文章里小編給大家整理的是關(guān)于node創(chuàng)建Vue項(xiàng)目步驟詳解內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-03-03
node.js中的fs.readFileSync方法使用說明
這篇文章主要介紹了node.js中的fs.readFileSync方法使用說明,本文介紹了fs.readFileSync的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
node?gyp安裝canvas原生模塊編譯node?pregyp詳解
這篇文章主要為大家介紹了Nodejs關(guān)于原生模塊編譯node-gyp + node-pre-gyp (以安裝canvas為例)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
NodeJs內(nèi)存占用過高的排查實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于NodeJs內(nèi)存占用過高的排查實(shí)戰(zhàn)記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
10個(gè)Node.js庫幫助你優(yōu)化代碼和簡化開發(fā)
這篇文章主要介紹了10個(gè)Node.js庫幫助你優(yōu)化代碼和簡化開發(fā),其中包括處理數(shù)組、對象、字符串庫Lodash,緩存數(shù)據(jù)處理庫Node-cache,解析、操作和格式化日期和時(shí)間庫Moment.js,Redis操作庫,發(fā)送電子郵件庫Nodemailer2023-05-05
手把手教你VSCode配置JavaScript基于Node.js的調(diào)試環(huán)境
最近在補(bǔ)數(shù)據(jù)結(jié)構(gòu),在用VScode調(diào)試js代碼文件結(jié)果怎么都不行,這篇文章主要給大家介紹了關(guān)于VSCode配置JavaScript基于Node.js的調(diào)試環(huán)境的相關(guān)資料,需要的朋友可以參考下2022-12-12

