zoukankan      html  css  js  c++  java
  • axios

    安装:   npm install axios --save
    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()

    项目地址:

    git clone git@github.com:ght5935/awareCloudAdmin.git
  • 相关阅读:
    codevs 3160 最长公共子串(SAM)
    noi2018d2t1
    后缀自动机
    [Scoi2014]方伯伯的玉米田
    【NOI2017】泳池
    【BZOJ2560】串珠子
    POJ 1737 统计有n个顶点的连通图有多少个 (带标号)
    【BZOJ3590】[Snoi2013]Quare 状压DP
    【BZOJ1095】【ZJOI2007】捉迷藏 [动态点分治]
    BZOJ1316: 树上的询问
  • 原文地址:https://www.cnblogs.com/gaoht/p/9877285.html
Copyright © 2011-2022 走看看