摘要:返回狀態(tài)碼,如果返回或者設(shè)置成,將會(huì)其他的將。一些錯(cuò)誤是在設(shè)置請(qǐng)求時(shí)觸發(fā)的你可以使用設(shè)置選項(xiàng)自定義狀態(tài)碼的錯(cuò)誤范圍。
axios
版本:v0.18.0
0.18.0的版本更新有一段時(shí)間了,使用起來(lái)跟原先基本沒(méi)有什么變化。但是增加了一些功能,例如錯(cuò)誤處理的辨別,于07-06-2018重新翻譯和校驗(yàn)了該翻譯,更正了一些錯(cuò)別字和表達(dá)不準(zhǔn)的地方,但是難免仍有錯(cuò)誤,歡迎指出。
由于工作需要,個(gè)人也包裝了一個(gè)簡(jiǎn)易的跟axios風(fēng)格一樣在小程序中使用的請(qǐng)求函數(shù)。方便一些使用類似vue寫法框架來(lái)開(kāi)發(fā)小程序的人更方便的無(wú)縫橋接。
有需要的讀者可以觀看一下。 傳送門
關(guān)于Promise的一練習(xí)和訓(xùn)練,此處有一個(gè)比較好的集合。傳送門
正文基于Promise的http庫(kù),適用于瀏覽器和node.js。
原文點(diǎn)擊查看原文
特色瀏覽器端發(fā)起XMLHttpRequests請(qǐng)求
node端發(fā)起http請(qǐng)求
支持Promise API
攔截請(qǐng)求和返回
轉(zhuǎn)化請(qǐng)求和返回(數(shù)據(jù))
取消請(qǐng)求
自動(dòng)轉(zhuǎn)化json數(shù)據(jù)
客戶端支持抵御XSRF(跨站請(qǐng)求偽造)
瀏覽器支持Latest ? | Latest ? | Latest ? | Latest ? | Latest ? | 8+ ? |
使用npm:
$ npm i axios
使用 bower
$ bower instal axios
使用cdn
示例
發(fā)起一個(gè)GET請(qǐng)求
const axios = require("axios") //發(fā)起一個(gè)user請(qǐng)求,參數(shù)為給定的ID axios.get("/user?ID=12345") .then(function(respone){ console.log(response); }) .catch(function(error){ console.log(error); }); //可配置的方式實(shí)現(xiàn)上面的代碼如下 axios.get("/user",{ params:{ ID:12345 } }).then(function(response){ console.log(response); }).catch(function(error){ console.log(error) });
注意:async/await是ECMAScript2017的語(yǔ)法,ie和一些老舊的瀏覽器不支持,請(qǐng)小心使用。
(譯者話:使用ts的話可以很容易的編譯和使用,也不需要任何墊片,目標(biāo)編譯成es5即可)
發(fā)起一個(gè)POST請(qǐng)求
axios.post("/user",{ firstName:"friend", lastName:"Flintstone" }) .then(function(response){ console.log(response); }) .catch(function(error){ console.log(error); });
發(fā)起一個(gè)多重并發(fā)請(qǐng)求
function getUserAccount(){ return axios.get("/user/12345"); } function getUserPermissions(){ return axios.get("/user/12345/permissions"); } axios.all([getUerAccount(),getUserPermissions()]) .then(axios.spread(function(acc,pers){ //兩個(gè)請(qǐng)求現(xiàn)在都完成 }));
譯者話:因?yàn)?b>axios.all使用的是類似Primise.all的功能,所以如果其中有一個(gè)請(qǐng)求出現(xiàn)了錯(cuò)誤那么就會(huì)停止請(qǐng)求,所以建議對(duì)于單個(gè)請(qǐng)求最好附加上處理的catch。
axios API根據(jù)自己需求可以對(duì)axios傳遞一些的設(shè)置來(lái)生成請(qǐng)求(Request)。
axios(config)
//發(fā)起 POST請(qǐng)求 axios({ method:"post",//方法 url:"/user/12345",//地址 data:{//參數(shù) firstName:"Fred", lastName:"Flintstone" } });
//通過(guò)請(qǐng)求獲取遠(yuǎn)程圖片 axios({ method:"get", url:"http://bit.ly/2mTM3Ny", responseType:"stream" }) .then(function(response){ response.data.pipe(fs.createWriteStream("ada_lovelace.jpg")) })
axios(url[,config])
//發(fā)起一個(gè)GET請(qǐng)求 axios("/user/12345/);請(qǐng)求方法的別名。
為了方便,axios提供了所有請(qǐng)求方法的別名支持
axios.request(config)
axios.get(url[,config])
axios.delete(url[,config])
axios.head(url[,config])
axios.options(url[,config])
axios.post(url[,data[,config]])
axios.put(url[,data[,config]])
axios.patch(url[,data[,config]])
當(dāng)時(shí)用別名方法時(shí)url,method,以及data屬性不必在config中明確指定(如上面示例的post方法請(qǐng)求)。
并發(fā) Concurrency有用的方法
axios.all(iterable)
axios.spread(callback)
你可以使用自定義設(shè)置創(chuàng)建一個(gè)新的實(shí)例
axios.create([config])
var instance = axios.create({ baseURL:"http://some-domain.com/api/", timeout:1000, headers:{"X-Custom-Header":"foobar"} });實(shí)例方法
下面列出了一些實(shí)例可用方法,具體的設(shè)置將在實(shí)例中應(yīng)用。
axios#request(config)
axios#get(url[,config])
axios#delete(url[,config])
axios#head(url[,config])
axios#options(url[,config])
axios#post(url[,data[,config]])
axios#put(url[,data[,config]])
axios#patch(url[,data[,config]])
以下列出了一些請(qǐng)求時(shí)的設(shè)置選項(xiàng)。只有url是必須的,如果沒(méi)有指明method的話,默認(rèn)的請(qǐng)求方法是GET.
{ //`url`是服務(wù)器鏈接,用來(lái)請(qǐng)求 url:"/user", //`method`是發(fā)起請(qǐng)求時(shí)的方法 method:`get`, //`baseURL`如果`url`不是絕對(duì)地址,那么將會(huì)加在其前面。 //可以很方便的對(duì)相對(duì)地址的axios實(shí)例設(shè)置`baseUrl`。 baseURL:"http://some-domain.com/api/", //`transformRequest`允許請(qǐng)求的數(shù)據(jù)在發(fā)送至服務(wù)器之前進(jìn)行轉(zhuǎn)化。 //這個(gè)只適用于`PUT`,`POST`,`PATCH`方法。 //數(shù)組中的最后一個(gè)函數(shù)必須返回一個(gè)字符串或者一個(gè)`ArrayBuffer`,或者`Stream`,`Buffer`實(shí)例,`ArrayBuffer`,`FormData` //此外你也可能需要設(shè)置下headers對(duì)象 transformRequest:[function(data,headers){ //依自己的需求對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行處理 return data; }], //`transformResponse`允許對(duì)返回的數(shù)據(jù)傳入then/catch之前進(jìn)行處理 transformResponse:[function(data){ //依需要對(duì)數(shù)據(jù)進(jìn)行處理 return data; }], //`headers`是自定義的要被發(fā)送的信息頭 headers:{"X-Requested-with":"XMLHttpRequest"}, //`params`是請(qǐng)求連接中的請(qǐng)求參數(shù),必須是一個(gè)純對(duì)象,或者URLSearchParams對(duì)象 params:{ ID:12345 }, //`paramsSerializer`是一個(gè)可選的函數(shù),用來(lái)控制和序列化參數(shù) //例如:(https://ww.npmjs.com/package/qs,http://api.jquery.com/jquery.param/) paramsSerializer: function(params){ return Qs.stringify(params,{arrayFormat:"brackets"}) }, //`data`是請(qǐng)求時(shí)作為請(qǐng)求體的數(shù)據(jù) //只適用于應(yīng)用的"PUT","POST","PATCH",請(qǐng)求方法 //當(dāng)沒(méi)有設(shè)置`transformRequest`時(shí),必須是以下其中之一的類型(不可重復(fù)?): //-string(字符串),plain object(純對(duì)象),ArrayBuffer,ArrayBufferView,URLSearchParams //-限瀏覽器:FormData(表格數(shù)據(jù)),File(文件數(shù)據(jù)),Blob //-限Node:Stream data:{ firstName:"fred" }, //`timeout`定義請(qǐng)求的時(shí)間,單位是毫秒。 //如果請(qǐng)求的時(shí)間超過(guò)這個(gè)設(shè)定時(shí)間,請(qǐng)求將會(huì)停止。 timeout:1000, //`withCredentials`表明跨跨域請(qǐng)求書否需要證明。 withCredentials:false //默認(rèn)值 //`adapter`適配器,允許自定義處理請(qǐng)求,這會(huì)使測(cè)試更簡(jiǎn)單。 //返回一個(gè)promise,并且提供一個(gè)有效的相應(yīng)。(查看[response docs](#response-api)) adapter:function(config){ /*...*/ }, //`auth`表明HTTP基礎(chǔ)的認(rèn)證應(yīng)該被使用,并且提供證書。 //這個(gè)會(huì)設(shè)置一個(gè)`authorization` 頭(header),并且覆蓋你在header設(shè)置的Authorization頭信息。 auth:{ username:"janedoe", password:"s00pers3cret" }, //`responsetype`表明服務(wù)器返回的數(shù)據(jù)類型,這些類型的設(shè)置應(yīng)該是 //"arraybuffer","blob","document","json","text",stream" responsetype:"json", //`responseEncoding`表明解析相應(yīng)的編碼方式。 //**注意**會(huì)忽視r(shí)esponseType為stream或者客戶端的請(qǐng)求。 responseEncoding:"utf8"http://默認(rèn)值 //`xsrfCookieName`時(shí)cookie做xsrf會(huì)話時(shí)的名字。 xsrfCookieName:"XSRF-TOKEN",//默認(rèn)值 //`xsrfHeaderName` 是http頭(header)的名字,并且該頭攜帶xsrf的值 xrsfHeadername:"X-XSRF-TOKEN",//默認(rèn)值 //`onUploadProgress`允許處理上傳過(guò)程的進(jìn)程事件 onUploadProgress: function(progressEvent){ //本地過(guò)程事件發(fā)生時(shí)想做的事 }, //`onDownloadProgress`允許處理下載過(guò)程的進(jìn)程事件 onDownloadProgress: function(progressEvent){ //下載過(guò)程中想做的事 }, //`maxContentLength` 定義http返回內(nèi)容的最大字節(jié)容量 maxContentLength: 2000, //`validateStatus` 定義promise的resolve和reject。 //http返回狀態(tài)碼,如果`validateStatus`返回true(或者設(shè)置成null/undefined),promise將會(huì)resolve;其他的promise將reject。 validateStatus: function(status){ return status >= 200 && stauts < 300;//默認(rèn) }, //`maxRedirect`定義重導(dǎo)向到node.js中的最大數(shù)量。 //如果值為0,那么沒(méi)有redirect。 maxREdirects:5,//默認(rèn)值 //`socketPath`定義一個(gè)在node.js中使用的 `UNIX Socket`。 //例如 `/var/run/docker.sock`發(fā)送請(qǐng)求到docker daemon。 //`socketPath`和`proxy`只可定義其一。 //如果都定義則只會(huì)使用`socketPath`。 socketPath:null,//默認(rèn)值 //`httpAgent` 和 `httpsAgent`當(dāng)產(chǎn)生一個(gè)http或者h(yuǎn)ttps請(qǐng)求時(shí)分別定義一個(gè)自定義的代理,在nodejs中。 //這個(gè)允許設(shè)置一些選選個(gè),像是`keepAlive`--這個(gè)在默認(rèn)中是沒(méi)有開(kāi)啟的。 httpAgent: new http.Agent({keepAlive:treu}), httpsAgent: new https.Agent({keepAlive:true}), //`proxy`定義服務(wù)器的主機(jī)名字和端口號(hào)。 //`auth`表明HTTP基本認(rèn)證應(yīng)該跟`proxy`相連接,并且提供證書。 //這個(gè)將設(shè)置一個(gè)"Proxy-Authorization"頭(header),覆蓋原先自定義的。 proxy:{ host:127.0.0.1, port:9000, auth:{ username:"cdd", password:"123456" } }, //`cancelTaken` 定義一個(gè)取消,能夠用來(lái)取消請(qǐng)求 //(查看 下面的Cancellation 的詳細(xì)部分) cancelToken: new CancelToken(function(cancel){ }) }返回響應(yīng)概要 Response Schema
一個(gè)請(qǐng)求的返回包含以下信息
{ //`data`是服務(wù)器的提供的回復(fù)(相對(duì)于請(qǐng)求) data{}, //`status`是服務(wù)器返回的http狀態(tài)碼 status:200, //`statusText`是服務(wù)器返回的http狀態(tài)信息 statusText: "ok", //`headers`是服務(wù)器返回中攜帶的headers headers:{}, //`config`是對(duì)axios進(jìn)行的設(shè)置,目的是為了請(qǐng)求(request) config:{} //`request`是獲取當(dāng)前相應(yīng)的請(qǐng)求 //它是node.js中最后一次的 ClientRequest的實(shí)例(在redirect中) //或者是在瀏覽器中的XMLHttpREquest實(shí)例 }
使用then時(shí),你會(huì)接受到下面的信息:
axios.get("/user/12345") .then(function(response){ console.log(response.data); console.log(response.status); console.log(response.statusText); console.log(response.headers); console.log(response.config); });
使用catch時(shí),或者傳入一個(gè)reject callback作為then的第二個(gè)參數(shù),那么返回的錯(cuò)誤信息將能夠被處理。
默認(rèn)設(shè)置(Config Default)你可以設(shè)置一個(gè)默認(rèn)的設(shè)置,這設(shè)置將在之后的每次請(qǐng)求中生效。
全局默認(rèn)設(shè)置 Global axios defaultsaxios.defaults.baseURL = "https://api.example.com"; axios.defaults.headers.common["Authorization"] = AUTH_TOKEN; axios.defaults.headers.post["Content-Type"]="application/x-www-form-urlencoded";實(shí)例中自定義默認(rèn)值 Custom instance default
//當(dāng)創(chuàng)建一個(gè)實(shí)例時(shí)進(jìn)行默認(rèn)設(shè)置 var instance = axios.create({ baseURL:"https://api.example.com" }); //或者在實(shí)例創(chuàng)建之后改變默認(rèn)值 instance.defaults.headers.common["Authorization"] = AUTH_TOKEN;設(shè)置優(yōu)先級(jí) Config order of precedence
設(shè)置(config)將按照優(yōu)先順序合并起來(lái)。首先的是在lib/defaults.js中定義的默認(rèn)設(shè)置,其次是defaults實(shí)例屬性的設(shè)置,最后是請(qǐng)求中config參數(shù)的設(shè)置。越往后面的等級(jí)越高,會(huì)覆蓋前面的設(shè)置。
看下面這個(gè)例子:
//使用默認(rèn)庫(kù)的設(shè)置創(chuàng)建一個(gè)實(shí)例, //這個(gè)實(shí)例中,使用的是默認(rèn)庫(kù)的timeout設(shè)置,默認(rèn)值是0。 var instance = axios.create(); //覆蓋默認(rèn)庫(kù)中timeout的默認(rèn)值 //此時(shí),所有的請(qǐng)求的timeout時(shí)間是2.5秒 instance.defaults.timeout = 2500; //覆蓋該次請(qǐng)求中timeout的值,這個(gè)值設(shè)置的時(shí)間更長(zhǎng)一些 instance.get("/longRequest",{ timeout:5000 });攔截器 interceptors
你可以在請(qǐng)求或者返回被then或者catch處理之前對(duì)他們進(jìn)行攔截。
//添加一個(gè)請(qǐng)求攔截器 axios.interceptors.request.use(function(config){ //在請(qǐng)求發(fā)送之前做一些事 return config; },function(error){ //當(dāng)出現(xiàn)請(qǐng)求錯(cuò)誤是做一些事 return Promise.reject(error); }); //添加一個(gè)返回?cái)r截器 axios.interceptors.response.use(function(response){ //對(duì)返回的數(shù)據(jù)進(jìn)行一些處理 return response; },function(error){ //對(duì)返回的錯(cuò)誤進(jìn)行一些處理 return Promise.reject(error); });
如果你需要在稍后移除攔截器,你可以
var myInterceptor = axios.interceptors.request.use(function(){/*...*/}); axios.interceptors.request.eject(myInterceptor);
你可以在一個(gè)axios實(shí)例中使用攔截器
var instance = axios.create(); instance.interceptors.request.use(function(){/*...*/});錯(cuò)誤處理 Handling Errors
axios.get("user/12345") .catch(function(error){ if(error.response){ //存在請(qǐng)求,但是服務(wù)器的返回一個(gè)狀態(tài)碼 //他們是在2xx之外 console.log(error.response.data); console.log(error.response.status); console.log(error.response.headers); }else if(error.request){ //如果是請(qǐng)求時(shí)的錯(cuò)誤,且沒(méi)有收到相應(yīng) //`error.request`是一個(gè)瀏覽器的XMLHttpRequest實(shí)例,或者node.js的 ClientRequest實(shí)例。 console.log(error.request) } else{ //一些錯(cuò)誤是在設(shè)置請(qǐng)求時(shí)觸發(fā)的 console.log("Error",error.message); } console.log(error.config); });
你可以使用validateStatus設(shè)置選項(xiàng)自定義HTTP狀態(tài)碼的錯(cuò)誤范圍。
axios.get("user/12345",{ validateStatus:function(status){ return status < 500;//當(dāng)返回碼小于等于500時(shí)視為錯(cuò)誤 } });取消 Cancellation
你可以使用cancel token取消一個(gè)請(qǐng)求
axios的cancel token API是基于已經(jīng)撤銷的**cnacelable promises proposal**提議。
你可以使用CancelToken.source工廠函數(shù)創(chuàng)建一個(gè)cancel token,如下:
var CancelToken = axios.CancelToken; var source = CancelToken.source(); axios.get("/user/12345", { cancelToken:source.toke }).catch(function(thrown){ if(axiso.isCancel(thrown)){ console.log("Rquest canceled", thrown.message); }else{ //handle error } }); //取消請(qǐng)求(信息參數(shù)設(shè)可設(shè)置的) source.cancel("操作被用戶取消");
你可以給CancelToken構(gòu)造函數(shù)傳遞一個(gè)executor function來(lái)創(chuàng)建一個(gè)cancel token:
var CancelToken = axios.CancelToken; var source = CancelToken.source() axios.get("/user/12345",{ cancelToke:source.token }).catch(function(thrown){ if(axios.isCancel(throw)){ console.log("請(qǐng)求已取消",throw.message) }else{ //處理錯(cuò)誤 } }) axios.post("/user/2345",{ name:"new name" },{ cancelToken:source.toke }) source.cancel("錯(cuò)做已被用戶取消!")
你也可以給CancelToke的構(gòu)造函數(shù)傳遞一個(gè)處理函數(shù)來(lái)生成一個(gè)cancel token。
const CancelToken = axios.CancelToken let cancel; acios.get("/user/12345",{ cancelToken:new CancelToken(function excutor(c){ //一個(gè)處理函數(shù)接受一個(gè)cancel函數(shù)作為參數(shù) cancel = c }) }) // 取消請(qǐng)求 cancel()
注意:你可以使用同一個(gè)cancel token取消多個(gè)請(qǐng)求。使用 application/x-www-form-urlencoded 格式
本人做的簡(jiǎn)單包裝
默認(rèn)情況下,axios串聯(lián)js對(duì)象為JSON格式。為了發(fā)送application/x-wwww-form-urlencoded格式數(shù)據(jù),
你可以使用一下的設(shè)置。
在瀏覽器中你可以如下使用URLSearchParams API:
var params = new URLSearchParams(); params.append("param1","value1"); params.append("param2","value2"); axios.post("/foo",params);
注意:URLSearchParams不支持所有的瀏覽器,但是這里有個(gè)墊片
(poly fill)可用(確保墊片在瀏覽器全局環(huán)境中)
其他方法:你可以使用qs庫(kù)來(lái)對(duì)數(shù)據(jù)編碼。
var qs = require("qs"); axios.post("/foo", qs.stringify({"bar":123}));
或者其他方法(es6)
import qs from "qs"; const data = {"bar":123}; const options = { method:"POST", headers:{ "content-type":"application/x-www-from-urlencoded" }, data:qs.stringify(data), url } axios(options)兼容Semver
當(dāng)axios放出1.0版本時(shí),一些不兼容的更改將會(huì)放在新的版本中。例如0.5.1和0.5.4有相同的api,但是0.6.0會(huì)有不兼容的變化。
譯者:小知識(shí)
在npn的版本習(xí)慣中,版本使用的習(xí)慣是a.b.c,其中c的變化是一些bug的修復(fù),b是一些功能的添加,a是大的版本的變化,會(huì)出現(xiàn)不兼容的情況。
在nodejs中,你可以如下使用querystring:
var querystring = require("querystring"); axios.post("http://something.com/", querystring.stringify({foo:"bar"}));
你同樣可以使用qs庫(kù)。
promisesaxios 基于原生的ES6 Promise 實(shí)現(xiàn)。如果環(huán)境不支持請(qǐng)使用墊片.
TypeScriptaxios 包含TypeScript定義
import axios from "axios" axios.get("/user?ID=12345")
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/81727.html
摘要:建立該倉(cāng)庫(kù)的目的主要是整理收集學(xué)習(xí)資源,統(tǒng)一管理,方便隨時(shí)查找。目前整合的學(xué)習(xí)資源只是前端方向的,可能會(huì)存在漏缺比較好的資源,需要慢慢的完善它,歡迎在該上補(bǔ)充資源或者提供寶貴的建議。 說(shuō)明 平時(shí)的學(xué)習(xí)資源都比較的凌亂,看到好的資源都是直接收藏在瀏覽器的收藏夾中,這樣其實(shí)并不方便,整理在云筆記上,也不方便查看修改記錄,索性就整理在 github 上并開(kāi)源出來(lái),希望幫助大家能夠更快的找到需...
摘要:最近項(xiàng)目中使用也遇到了一些問(wèn)題,就借此機(jī)會(huì)總結(jié)一下,如有錯(cuò)誤,還請(qǐng)不吝指正。而在使用時(shí)對(duì)應(yīng)的傳參使用的是,是作為請(qǐng)求體發(fā)送的,同樣使用這種形式的還有等請(qǐng)求方式。層在環(huán)境中可以使用。 Axios是一個(gè)基于Promise的 HTTP 庫(kù),可以用在瀏覽器和node.js 中,因?yàn)橛却蟠蟮耐扑],axios也變得越來(lái)越流行。最近項(xiàng)目中使用axios也遇到了一些問(wèn)題,就借此機(jī)會(huì)總結(jié)一下,如有錯(cuò)誤,...
摘要:本文是學(xué)習(xí)了年新鮮出爐的提案之后,針對(duì)異步請(qǐng)求數(shù)據(jù)寫的一個(gè)案例。注意,本文假設(shè)了你已經(jīng)初步了解的含義了,如果不了解還請(qǐng)移步官方文檔。但不要忘記和上下文對(duì)象可以看做是寫法的以及三個(gè)鉤子函數(shù)的組合。 本文是學(xué)習(xí)了2018年新鮮出爐的React Hooks提案之后,針對(duì)異步請(qǐng)求數(shù)據(jù)寫的一個(gè)案例。注意,本文假設(shè)了:1.你已經(jīng)初步了解hooks的含義了,如果不了解還請(qǐng)移步官方文檔。(其實(shí)有過(guò)翻譯...
閱讀 2460·2021-10-09 09:41
閱讀 3335·2021-09-26 09:46
閱讀 905·2021-09-03 10:34
閱讀 3244·2021-08-11 11:22
閱讀 3435·2019-08-30 14:12
閱讀 778·2019-08-26 11:34
閱讀 3400·2019-08-26 11:00
閱讀 1841·2019-08-26 10:26