美文网首页
React项目模板-axios的使用

React项目模板-axios的使用

作者: stevekeol | 来源:发表于2019-05-10 13:22 被阅读0次

项目源地址

axios

基于Promise的用于浏览器和Node.js的http客户端.

特点

  • 支持浏览器和node.js
  • 支持promise
  • 能拦截请求和响应
  • 能转换请求和响应数据
  • 能取消请求
  • 自动转换JSON数据
  • 浏览器端支持防止CSRF(跨站请求伪造)

安装

npm install axios --save

一、基本使用

发起get请求:

//初始写法
axios.get('/user?ID=12345')
  .then((res) => console.log(res);})
  .catch((err) => console.log(error);});

//改进写法(1)
let option = {
    params: {
      ID: 12345
    }
}
axios.get('/user', option)
  .then((res) => console.log(res);})
  .catch((err) => console.log(error);});

//改进写法(2)-- 推荐写法
let option = {
    url: '/user',
    params: {
      ID: 12345
    }
}
axios.get(option)
  .then((res) => console.log(res);})
  .catch((err) => console.log(error);});
  • url?后面携带的参数键值对,可以利用axios的params关键字挂载

发起post请求

let option = {
    url: '/user',
    data: {
       firstName: 'Fred',
       lastName: 'Flintstone'       
    }
}
axios.post(option)
  .then((res) => console.log(res))
  .catch((err) => console.log(err));
  • 当使用了axios.get/post等方式,就可以不在optionmethod字段上挂载get/post;

二、进阶使用

获取远程图片

let option = {
  url:'http://bit.ly/2mTM3nY',
  responseType:'stream'
}

axios.get(option)
  .then((res) => res.data.pipe(fs.createWriteStream('ada_lovelace.jpg')));

使用axios.all并发请求

function getUserOne() {
  return axios.get('/user/123');
}
function getUseAnother() {
  return axios.get('/user/456');
}
 
axios.all([getUserOne(), getUseAnother()])
  .then(axios.spread((resOne, resAnother) => {
    console.log(resOne.data);
    console.log(resAnother.data);
  }));
  • axios.all()当所有的请求都完成后.then会收到一个多个响应对象构成的数组,其中的顺序和请求发送的顺序相同。
  • 可以使用 axios.spread() 分割成多个单独的响应对象。

使用axios.cerate创建一个拥有通用配置的axios实例

三、高级使用

请求配置项

{
  url: '/user',
  method: 'get', // default
  baseURL: 'https://some-domain.com/api/',
  transformRequest: [function (data, headers) {
    //do sothing
    return data;
  }],
  transformResponse: [function (data) {
    //do sothing
    return data;
  }],
 
  headers: {'X-Requested-With': 'XMLHttpRequest'},
  params: {
    ID: 12345
  },
  paramsSerializer: function(params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },
  data: {
    firstName: 'Fred'
  },
  timeout: 1000,
  withCredentials: false, // default
  adapter: function (config) {
    /* ... */
  },
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },
  responseType: 'json', // default
  xsrfCookieName: 'XSRF-TOKEN', // default
  xsrfHeaderName: 'X-XSRF-TOKEN', // default
  onUploadProgress: function (progressEvent) {
    //do something
  },
  onDownloadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },
  maxContentLength: 2000,
  validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  },
  maxRedirects: 5, // default
  socketPath: null, // default
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },
  cancelToken: new CancelToken(function (cancel) {
  })
}

响应的组成(res的结构)

{
  data: {},
  status: 200,
  statusText: 'OK',
  headers: {},
  config: {}, //req中的config
  request: {}
}

附录

问题一:

//OK
export function get() {
  return new Promise((resolve) => {
    axios.get('http://mock-api.com/WmnE4LgJ.mock/getPhone')
      .then((res) => resolve(res.data ? res.data : []));
  });
}
//报错
export function get() {
  const initialOption = {
    url: 'http://mock-api.com/WmnE4LgJ.mock/getPhone'
  };
  return new Promise((resolve) => {
    axios.get(initialOption)
      .then((res) => resolve(res.data ? res.data : []));
  });
}
报错信息
//这样是OK的
export function get() {
  const initialOption = {
    method: 'get',
    url: 'http://mock-api.com/WmnE4LgJ.mock/getPhone'
  };
  return new Promise((resolve) => {
    axios(initialOption)
      .then((res) => resolve(res.data ? res.data : []));
  });
}
  • 说明了什么?(method必须要放在option里面)
//这样也是可以的
export function get() {
  const initialOption = {
    method: 'get',
    baseURL: config.baseURL,
    url: '/getPhone'
  };
  return new Promise((resolve) => {
    axios(initialOption)
      .then((res) => resolve(res.data ? res.data : []));
  });
}

附录二

  • axios最后的使用方式
// actions/index.js
export const FETCH_ROMOTE_DATA = 'FETCH_ROMOTE_DATA';

export function fetchRemoteData() {
  const option = {
    url: '/getPhone'
  };
  return {
    type: FETCH_ROMOTE_DATA,
    payload: axios.get(option)
  };
}

/**
 * 1. 调用axios.get(),可以传入参数option={url: '/getPhone', params: {ID: '12345'}}
 * 2. 调用axios.post(),可以传入参数option={url: '/postUserInfo', data: {name: 'zhang', age: '18'}}
 */

// utils/axios.js
export function get(option) {
  const initialOption = {
    method: 'get',
    baseURL: config.baseURL
  };
  const _option = Object.assign(initialOption, option);
  return new Promise((resolve) => {
    axios(_option)
      .then((res) => resolve(res.data ? res.data : []));
  });
}

export function post(option) {
  const initialOption = {
    method: 'post',
    baseURL: config.baseURL
  };
  const _option = Object.assign(initialOption, option);
  return new Promise((resolve) => {
    axios(_option)
      .then((res) => resolve(res.data ? res.data : []));
  });
}


//reducers/getRemoteData.js
略

相关文章

网友评论

      本文标题:React项目模板-axios的使用

      本文链接:https://www.haomeiwen.com/subject/bcigoqtx.html