Axios-指南

分享一下axios的相關知識javascript

1、axios

   基於promise用於瀏覽器和node.js的http客戶端java

2、特色

  • 支持瀏覽器和node.js
  • 支持promise
  • 能攔截請求和響應
  • 能轉換請求和響應數據
  • 能取消請求
  • 自動轉換JSON數據
  • 瀏覽器端支持防止CSRF(跨站請求僞造)

3、安裝

npm安裝node

npm install axios
複製代碼

bower安裝jquery

bower install axios
複製代碼

cdn引入ios

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
複製代碼

4、例子

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) {
    // 當這兩個請求都完成的時候會觸發這個函數,兩個參數分別表明返回的結果
  }));
複製代碼

5、axios的API

(一)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]]);
複製代碼
  • 注意:當使用以上別名方法時,urlmethoddata等屬性不用在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]])
複製代碼

6、請求的配置(request 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… 來源:簡書

6、響應組成(請求返回的內容)

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);
  });
複製代碼

7、默認配置

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
});
複製代碼

8、攔截器

1.你能夠在thencatch以前攔截請求和響應。

// 添加一個請求攔截器
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 () {/*...*/});
複製代碼

9、錯誤處理

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
  }
})
複製代碼

10、取消請求

  • 你能夠經過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();
複製代碼

關注個人我的博客:pinbolei.cn,獲取更多內容

相關文章
相關標籤/搜索