axios 详解

来源:互联网 发布:软件项目阶段 编辑:程序博客网 时间:2024/05/20 01:38

安装到项目中:

1
# npm install axios --save

在项目中import使用:

import axios from 'axios'

Axios和其他的ajax库都是很类似的,提供了2种使用的方式一种是直接使用实例方法的如:
下面是实例的所有可用方法,方法中的config会与axios实例中的config合并。(实例可以将一些通用的config先配置好)

1
2
3
4
5
6
7
axios.get('/user?ID=12345')
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});

 

Config 配置:

复制代码
{  // `url`是将用于请求的服务器URL  url: '/user',  // `method`是发出请求时使用的请求方法  method: 'get', // 默认  // `baseURL`将被添加到`url`前面,除非`url`是绝对的。  // 可以方便地为 axios 的实例设置`baseURL`,以便将相对 URL 传递给该实例的方法。  baseURL: 'https://some-domain.com/api/',  // `transformRequest`允许在请求数据发送到服务器之前对其进行更改  // 这只适用于请求方法'PUT','POST'和'PATCH'  // 数组中的最后一个函数必须返回一个字符串,一个 ArrayBuffer或一个 Stream  transformRequest: [function (data) {    // 做任何你想要的数据转换    return data;  }],  // `transformResponse`允许在 then / catch之前对响应数据进行更改  transformResponse: [function (data) {    // Do whatever you want to transform the data    return data;  }],  // `headers`是要发送的自定义 headers  headers: {'X-Requested-With': 'XMLHttpRequest'},  // `params`是要与请求一起发送的URL参数  // 必须是纯对象或URLSearchParams对象  params: {    ID: 12345  },  // `paramsSerializer`是一个可选的函数,负责序列化`params`  // (e.g. 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`时,必须是以下类型之一:  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams  // - Browser only: FormData, File, Blob  // - Node only: Stream  data: {    firstName: 'Fred'  },  // `timeout`指定请求超时之前的毫秒数。  // 如果请求的时间超过'timeout',请求将被中止。  timeout: 1000,  // `withCredentials`指示是否跨站点访问控制请求  // should be made using credentials  withCredentials: false, // default  // `adapter'允许自定义处理请求,这使得测试更容易。  // 返回一个promise并提供一个有效的响应(参见[response docs](#response-api))  adapter: function (config) {    /* ... */  },  // `auth'表示应该使用 HTTP 基本认证,并提供凭据。  // 这将设置一个`Authorization'头,覆盖任何现有的`Authorization'自定义头,使用`headers`设置。  auth: {    username: 'janedoe',    password: 's00pers3cret'  },  // “responseType”表示服务器将响应的数据类型  // 包括 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'  responseType: 'json', // default  //`xsrfCookieName`是要用作 xsrf 令牌的值的cookie的名称  xsrfCookieName: 'XSRF-TOKEN', // default  // `xsrfHeaderName`是携带xsrf令牌值的http头的名称  xsrfHeaderName: 'X-XSRF-TOKEN', // default  // `onUploadProgress`允许处理上传的进度事件  onUploadProgress: function (progressEvent) {    // 使用本地 progress 事件做任何你想要做的  },  // `onDownloadProgress`允许处理下载的进度事件  onDownloadProgress: function (progressEvent) {    // Do whatever you want with the native progress event  },  // `maxContentLength`定义允许的http响应内容的最大大小  maxContentLength: 2000,  // `validateStatus`定义是否解析或拒绝给定的promise  // HTTP响应状态码。如果`validateStatus`返回`true`(或被设置为`null` promise将被解析;否则,promise将被  // 拒绝。  validateStatus: function (status) {    return status >= 200 && status < 300; // default  },  // `maxRedirects`定义在node.js中要遵循的重定向的最大数量。  // 如果设置为0,则不会遵循重定向。  maxRedirects: 5, // 默认  // `httpAgent`和`httpsAgent`用于定义在node.js中分别执行http和https请求时使用的自定义代理。  // 允许配置类似`keepAlive`的选项,  // 默认情况下不启用。  httpAgent: new http.Agent({ keepAlive: true }),  httpsAgent: new https.Agent({ keepAlive: true }),  // 'proxy'定义代理服务器的主机名和端口  // `auth`表示HTTP Basic auth应该用于连接到代理,并提供credentials。  // 这将设置一个`Proxy-Authorization` header,覆盖任何使用`headers`设置的现有的`Proxy-Authorization` 自定义 headers。  proxy: {    host: '127.0.0.1',    port: 9000,    auth: : {      username: 'mikeymike',      password: 'rapunz3l'    }  },  // “cancelToken”指定可用于取消请求的取消令牌  // (see Cancellation section below for details)  cancelToken: new CancelToken(function (cancel) {  })}
复制代码

 

response 响应:

复制代码
// 服务器返回的数据data: {},// HTTP状态吗status: 200,// 服务器返回的消息statusText: 'OK',// 返回头headers: {},// 在返回我们的配置config: {}
复制代码

 

统一配置:

axios.defaults.timeout = 5000;axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';axios.defaults.baseURL = 'http://www.xxxx.xxx/api';// axios.defaults.baseURL = 'http://192.168.1.129:8383';

 

Interceptors 拦截器

这里我必须重点介绍,在我们发起大量的请求时候,需要对请求做统一的处理那就用到它了。笔者在使用了vue-resourceaxios之后亲身比较,axios的配置更加人性化。
官方的API上这样介绍

You can intercept requests or responses before they are handled by then or catch.
您可以拦截请求或响应之前,他们处理的操作或者异常

 

实例用法:

复制代码
import axios from 'axios'import qs from 'qs'axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';//POST传参序列化
let params = {
  username: 'tzf',
  password: '123456'
}
axios.post(
  'https://domail.com/api/login', //url
  qs.stringify(params)
).then(
  res => {
    console.log(res.data)
  },
  error => {
    console.log(error)
  }
)
复制代码

 

request统一处理操作

如果是POST的请求,配置中可不能用params字段了,需要使用data字段。
这里有个小地方需要注意,POST的传参需要序列化,不然服务端不会正确的接收哦,会报错。所以这里我们要对request的数据进行一次序列化。这里我用了qs,直接import qs from 'qs' 即可

复制代码
import axios from 'axios'import qs from 'qs'axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';//POST传参序列化axios.interceptors.request.use((config) => {  if(config.method  === 'post'){    config.data = qs.stringify(config.data);  }  return config;},(error) =>{   alert("错误的传参");  return Promise.reject(error);
复制代码

 

response统一处理操作

也就是说我们可以统一的在发起请求前,或者获得数据,对其进行统一的操作。这点非常的高效,在笔者的项目中,接口会返回一个code,就和微信API一样,code为200代表返回请求数据正确为其它时就自动跳出弹窗打印消息即可。

复制代码
//code状态码200判断axios.interceptors.response.use((res) =>{  if(res.data.code != '200'){    alert(res.data.msg);    return Promise.reject(res);  }  return res;}, (error) => {  alert("网络异常");  return Promise.reject(error);});
复制代码

如果发生这些错误了我要结束当前的Promise所以返回一个Promise.reject(res),停止Promise队列下面的操作,如果有对于Promise不熟悉的童鞋请自行搜索Promise(这里还遇到了一个小坑最后会介绍)

 

参考配置

文件名是config/http.js

复制代码
import axios from 'axios'import qs from 'qs'import * as _ from './whole'axios.defaults.timeout = 5000;axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';axios.defaults.baseURL = 'http://www.guinaben.com:8070';// axios.defaults.baseURL = 'http://192.168.1.129:8383';//POST传参序列化axios.interceptors.request.use((config) => {  if(config.method  === 'post'){    config.data = qs.stringify(config.data);  }  return config;},(error) =>{   _.toast("错误的传参");  return Promise.reject(error);});//code状态码200判断axios.interceptors.response.use((res) =>{  if(res.data.code != '200'){    _.toast(res.data.msg);    return Promise.reject(res);  }  return res;}, (error) => {  _.toast("网络异常");  return Promise.reject(error);});export default axios;
复制代码

发起的请求

复制代码
import axios from 'config/http'axios({  method:'get',  url: 'xxxx/xxxxx',  params: {    "textbook_id":id,    "token":token  }}).then((response) => {  resolve(response);})axios({  method:'post',  url: 'teacher/pwd/resetByMobile',  data: {   "textbook_id":id,    "token":token  }}).then((response) => {    resolve(response);})
复制代码

一定要看

因为这里我使用的Promise,所以在安卓4.4.3一下的手机还是不支持Promise的,所以会报错。需要引入npm install babel-polyfillnpm install babel-runtime,在入口文件上加上即可。

import 'babel-polyfill'

 

POST请求时,参数需要使用qs.stringify()
原创粉丝点击