分享一下axios的相關知識javascript
基於promise
用於瀏覽器和node.js
的http客戶端java
npm安裝
node
npm install axios
複製代碼
bower安裝
jquery
bower install axios
複製代碼
cdn引入
ios
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
複製代碼
1.發送一個GET
請求npm
// 經過給定的ID來發送請求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 以上請求也能夠經過這種方式來發送
axios.get('/user',{
params:{
ID:12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
複製代碼
2.發送一個POST
請求json
axios.post('/user',{
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
複製代碼
3.同時發起多個請求axios
function getUserAccount () {
return axios.get ('/user/12345');
};
function getUserPermissions () {
return axios.get ('/user/12345/permissions');
};
axios.all([getUserAccount(),getUserPermissions()])
.then(axios.spread (function (acct,perms) {
// 當這兩個請求都完成的時候會觸發這個函數,兩個參數分別表明返回的結果
}));
複製代碼
(一)axios能夠經過配置(config
)來發送請求 1.axios(config)
api
// 發送一個`POST`請求
axios({
method: 'POST',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
複製代碼
// 獲取遠程圖片
axios({
method:'get',
url:'http://bit.ly/2mTM3nY',
responseType:'stream'
})
.then(function(response) {
response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
});
複製代碼
2.axios(url[, config])
跨域
// // 發起一個GET請求(GET是默認的請求方法)
axios('/user/12345');
複製代碼
(二)請求方法別名 爲了方便咱們爲全部支持的請求方法均提供了別名。
axios.request(url);
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]]);
複製代碼
url
,method
和data
等屬性不用在config重複聲明。(三)同時發生的請求(Concurrency) 如下兩個用來處理同時發生多個請求的輔助函數
// iterable是一個能夠迭代的參數,如數組等
axios.all(iterable);
// callback要等到全部請求都完成纔會執行
axios.spread(callback)
複製代碼
(四)建立一個實例 你能夠建立一個擁有通用配置的axios
實例 1.axios.creat([config])
var instance = axios.cerate({
baseURL:'https://some-domain.com/api/',
timeout:1000,
headers:{'X-Custom-Header':'foobar'}
});
複製代碼
2.實例的方法 如下是全部可用的實例方法,額外聲明的配置將與利用create建立的實例配置合併
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]])
複製代碼
如下就是請求的配置選項,只有url
選項是必須的,若是method
選項未定義,那麼它默認是以GET
的方式發出請求
{
// `url`是請求的服務器地址
url:'/user',
//`method`是請求資源的方式
method:'get'//default
//若是`url`不是絕對地址,那麼`baseURL`將會加到`url`的前面
//當`url`是相對地址的時候,設置`baseURL`會很是的方便
baseURL:'https://some-domain.com/api/',
//`transformRequest`選項容許咱們在請求發送到服務器以前對請求的數據作出一些改動
//該選項只適用於如下請求方式:`put/post/patch`
//數組裏面的最後一個函數必須返回一個字符串、-一個`ArrayBuffer`或者`Stream`
transformRequest:[function(data){
//在這裏根據本身的需求改變數據
return data;
}],
//`transformResponse`選項容許咱們在數據傳送到`then/catch`方法以前對數據進行改動
transformResponse:[function(data){
//在這裏根據本身的需求改變數據
return data;
}],
//`headers`選項是須要被髮送的自定義請求頭信息
headers: {'X-Requested-With':'XMLHttpRequest'},
//`params`選項是要隨請求一塊兒發送的請求參數----通常連接在URL後面
//他的類型必須是一個純對象或者是URLSearchParams對象
params: {
ID:12345
},
//`paramsSerializer`是一個可選的函數,起做用是讓參數(params)序列化
//例如(https://www.npmjs.com/package/qs,http://api.jquery.com/jquery.param)
paramsSerializer: function(params){
return Qs.stringify(params,{arrayFormat:'brackets'})
},
//`data`選項是做爲一個請求體而須要被髮送的數據
//該選項只適用於方法:`put/post/patch`
//當沒有設置`transformRequest`選項時dada必須是如下幾種類型之一
//string/plain/object/ArrayBuffer/ArrayBufferView/URLSearchParams
//僅僅瀏覽器:FormData/File/Bold
//僅node:Stream
data {
firstName:"Fred"
},
//`timeout`選項定義了請求發出的延遲毫秒數
//若是請求花費的時間超過延遲的時間,那麼請求會被終止
timeout:1000,
//`withCredentails`選項代表了是不是跨域請求
withCredentials:false,//default
//`adapter`適配器選項容許自定義處理請求,這會使得測試變得方便
//返回一個promise,並提供驗證返回
adapter: function(config){
/*..........*/
},
//`auth`代表HTTP基礎的認證應該被使用,並提供證書
//這會設置一個authorization頭(header),並覆蓋你在header設置的Authorization頭信息
auth: {
username:"zhangsan",
password: "s00sdkf"
},
//返回數據的格式
//其可選項是arraybuffer,blob,document,json,text,stream
responseType:'json',//default
//
xsrfCookieName: 'XSRF-TOKEN',//default
xsrfHeaderName:'X-XSRF-TOKEN',//default
//`onUploadProgress`上傳進度事件
onUploadProgress:function(progressEvent){
//下載進度的事件
onDownloadProgress:function(progressEvent){
}
},
//相應內容的最大值
maxContentLength:2000,
//`validateStatus`定義了是否根據http相應狀態碼,來resolve或者reject promise
//若是`validateStatus`返回true(或者設置爲`null`或者`undefined`),那麼promise的狀態將會是resolved,不然其狀態就是rejected
validateStatus:function(status){
return status >= 200 && status <300;//default
},
//`maxRedirects`定義了在nodejs中重定向的最大數量
maxRedirects: 5,//default
//`httpAgent/httpsAgent`定義了當發送http/https請求要用到的自定義代理
//keeyAlive在選項中沒有被默認激活
httpAgent: new http.Agent({keeyAlive:true}),
httpsAgent: new https.Agent({keeyAlive:true}),
//proxy定義了主機名字和端口號,
//`auth`代表http基本認證應該與proxy代理連接,並提供證書
//這將會設置一個`Proxy-Authorization` header,而且會覆蓋掉已經存在的`Proxy-Authorization` header
proxy: {
host:'127.0.0.1',
port: 9000,
auth: {
username:'skda',
password:'radsd'
}
},
//`cancelToken`定義了一個用於取消請求的cancel token
//詳見cancelation部分
cancelToken: new cancelToken(function(cancel){
})
}
複製代碼
做者:FunnySeeker 連接:www.jianshu.com/p/df464b26a… 來源:簡書
1.response
由如下幾部分信息組成
{
// 服務端返回的數據
data: {},
// 服務端返回的狀態碼
status: 200,
// 服務端返回的狀態信息
statusText: 'OK',
// 響應頭,全部的響應頭名稱都是小寫
headers: {},
// axios請求配置
config: {},
// 請求
request: {}
}
複製代碼
2.用then
接收如下響應信息
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);
});
複製代碼
1.全局修改axios默認配置
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
複製代碼
2.自定義的實例默認設置
// 建立實例時修改配置
var instance = axios.create({
baseURL: 'https://api.example.com'
});
// 實例建立以後修改配置
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
複製代碼
3.配置優先級 配置項經過必定的規則合併,request config
> instance.defaults
> 系統默認
,優先級高的覆蓋優先級低的。
// 建立一個實例,這時的超時時間爲系統默認的 0
var instance = axios.create();
// 經過instance.defaults從新設置超時時間爲2.5s,由於優先級比系統默認高
instance.defaults.timeout = 2500;
// 經過request config從新設置超時時間爲5s,由於優先級比instance.defaults和系統默認都高
instance.get('/longRequest', {
timeout: 5000
});
複製代碼
1.你能夠在then
和catch
以前攔截請求和響應。
// 添加一個請求攔截器
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// 添加一個響應攔截器
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
複製代碼
2.移除攔截器
var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
複製代碼
3.爲axios實例添加一個攔截器
var instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});
複製代碼
axios.get('/user/12345')
.catch(function (error) {
if (error.response) {
// 發送請求後,服務端返回的響應碼不是 2xx
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// 發送請求可是沒有響應返回
console.log(error.request);
} else {
// 其餘錯誤
console.log('Error', error.message);
}
console.log(error.config);
});
複製代碼
能夠用validateStatus
定義一個http狀態碼返回的範圍
axios.get('/user/12345', {
validateStatus: function (status) {
return status < 500; // Reject only if the status code is greater than or equal to 500
}
})
複製代碼
cancel token
來取消一個請求 1.你能夠經過CancelToken.source
工廠函數來建立一個cancel token
ar CancelToken = axios.CancelToken;
var source = CancelToken.source();
axios.get('/user/12345',{
cancelToken: source.token
}).catch(function(thrown){
if(axios.isCancel(thrown)){
console.log('Request canceled',thrown.message);
}else {
//handle error
}
});
//取消請求(信息的參數能夠設置的)
source.cance("操做被用戶取消");
複製代碼
2.你能夠給cancelToken
構造函數傳遞一個executor function
來建立一個cancel token
var cancelToken = axios.CancelToken;
var cance;
axios.get('/user/12345',{
cancelToken: new CancelToken(function(c){
//這個executor函數接受一個cancel function做爲參數
cancel = c;
})
})
//取消請求
cancel();
複製代碼