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
  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/gaoht/p/9877285.html
Copyright © 2011-2022 走看看