#说明

各种对于网络请求的封装,不同时间会有不同需求,当然,写法也更简洁

笔记分享:hongjilin
转载请注明出处。

一、axios封装写法1 -2020

该模块封装于2020疫情本人撰写 nodejs+vue搭建校园疫情防控系统实战项目(全栈项目)项目期间,主要用于项目中前端部分前后端交互功能实现中

文件上传模块 hongjilin 2020年7月29日

Ⅰ-代码示例

该代码用于Vue项目

```javascript //main.js

import axios from ‘axios’ axios.defaults.baseURL = ‘http://localhost:3000‘; /**

  • //封装axios方法,为不需要登录操作时使用,也可以提前传入token
  • @param options 配置 */ let Axios= (options)=>{ axios({
    1. url:options.url,
    2. method:options.method||'POST',
    3. data: options.data,
    4. params: options.data
    }).then(result=>{
    1. if (options.success) options.success(result.data)
    }).catch(err=>{
    1. let msg = err.response ? err.response.data:'请求异常'
    2. if (options.error){
    3. options.error(msg)
    4. Message.error({message: msg, offset: 150});
    5. }else {
    6. Message.error({message: msg, offset: 150});
    7. }
    }) } //不拦截的(不带token)往往用在vue创建前的生命周期中 Vue.prototype.$Axios = Axios ```

Ⅱ-使用示例

使用时因为是在main中将其挂载在了Vue实例上,所以可以直接this进行调用

  1. this.$Axios({
  2. url: "/students/gethealthNowDay",
  3. method: "get",
  4. data: {},
  5. success: (result) => { ... },
  6. });

二、axios封装写法2-2021

本代码于2021年在react项目中进行使用

1、带token进行请求

代码示例

默认带token进行请求

  1. axios.defaults.withCredentials:登录之后的请求会带登录用户信息,需要把登录时的cookie设置到之后的请求头里面。而跨域请求要想带上cookie,必须要请求属性withCredentials=true,这是浏览器的同源策略导致的问题:不允许JS访问跨域的Cookie。
    withCredentials 属性是一个Boolean类型,它指示了是否该使用类似cookies,authorization,headers(头部授权)或者TLS客户端证书这一类资格证书来创建一个跨站点访问控制(cross-site Access-Control)请求。
  2. cancelTokenSource:取消ajax请求的

```tsx import axios from ‘axios’; const cancelTokenSource = axios.CancelToken.source(); const API_HOST=’https://gitee.com/hongjilin/hongs-study-notes‘ axios.defaults.withCredentials = true; //允许跨域携带cookie信息 function handleRequestToken(config: AxiosRequestConfig): void { const { url = ‘’ } = config; const token = “从数据库得到的token”;//此处需要从后台获取 if (token) config.headers[‘Token’] = token; else cancelTokenSource.cancel();//如果token为空或者错误,取消请求 }

// 创建axios实例 const Http = axios.create({ timeout: 1000 60 3, withCredentials: true, //前面已经设置默认为true,此处可以不设置 baseURL: ${API_HOST}, //设置基础路径 cancelToken: cancelTokenSource.token, //此处于前面存入token相互呼应 }); Http.interceptors.request.use( //请求拦截器,发送请求前运行的代码,主要用来打印日志方便调错 (config) => { config.headers[‘Content-Type’] = ‘application/json’; config.data = JSON.stringify(config.data); console.warn(‘—- Http request start —-‘); console.log(config.method, config.url); console.log(config.data || config.params); console.warn(‘—- Http request end—-‘); handleRequestToken(config); return config; }, (error) => { console.error(error); } ); Http.interceptors.response.use( //响应拦截器 (response) => { const data = response.data; // 打印结果 console.error(‘—- Http response start —-‘); console.log(response.config); console.log(response.config.url); console.log(response.data); console.error(‘—- Http response end —-‘); return data; }, (error) => { console.info(‘网络异常’); return Promise.reject(error); } );

export default Http;

  1. <a name="86cad981"></a>
  2. ## 2、不带token进行请求
  3. <a name="b5ea48ff-1"></a>
  4. ### 代码示例
  5. > ```jsx
  6. import axios from 'axios';
  7. const cancelTokenSource = axios.CancelToken.source();
  8. const API_HOST='https://gitee.com/hongjilin/hongs-study-notes'
  9. axios.defaults.withCredentials = true;
  10. // 创建axios实例
  11. const NologinHttp = axios.create({
  12. timeout: 1000 * 60 * 3,
  13. withCredentials: true,
  14. baseURL: `${API_HOST}`,
  15. cancelToken: cancelTokenSource.token,
  16. });
  17. NologinHttp.interceptors.request.use(
  18. (config) => {
  19. config.headers['Content-Type'] = 'application/json';
  20. config.data = JSON.stringify(config.data);
  21. console.warn('--- NologinHttp request start ---');
  22. console.log(config.method, config.url);
  23. console.log(config.data || config.params);
  24. console.warn('--- NologinHttp request end---');
  25. return config;
  26. },
  27. (error) => {
  28. console.error(error);
  29. }
  30. );
  31. NologinHttp.interceptors.response.use(
  32. (response) => {
  33. const data = response.data;
  34. // 打印结果
  35. console.error('--- NologinHttp response start ---');
  36. console.log(response.config);
  37. console.log(response.config.url);
  38. console.log(response.data);
  39. console.error('--- NologinHttp response end ---');
  40. return data;
  41. },
  42. (error) => {
  43. console.info('网络异常');
  44. return Promise.reject(error);
  45. }
  46. );
  47. export default NologinHttp;

3、使用示例

此处分为两处代码,方便项目模块化开发,也可以直接在2处调用

  1. CompanyApi声明—即调用请求
  1. import { Http } from '~/utils';
  2. interface IsPage{
  3. current:number,
  4. pageSize:number
  5. }
  6. export const CompanyApi = {
  7. /**
  8. *
  9. * @param params 传入参数
  10. * @param page {current,pageSize} 当前页码与页码数
  11. * @returns
  12. */
  13. getCompanyInfo(params, page:IsPage) {
  14. // return Http({
  15. // //服务端有要求: 将页数和页码拼接进url中 "/app/console/xxxx/1/10 ?name=" 这种格式
  16. // url: '/app/console/company/' + currentPage + '/' + pageSize,
  17. // method: 'GET',
  18. // params,
  19. // });
  20. return Http.get(`/app/console/xxxx/${page.current}/${page.pageSize}/`,{params})
  21. },
  22. getIpInfo(params: any,page:IsPage) {
  23. return Http.get(`/app/console/xxxx/ip/${page.current}/${page.pageSize}/`,{params})
  24. },
  25. getShopInfo(params: any,page: IsPage) {
  26. return Http.get(`/app/console/xxxx/store/${page.current}/${page.pageSize}/`,{params})
  27. },
  28. };
  1. 请求后对数据处理
  1. import { CompanyApi } from '~/api';
  2. const { getIpInfo } = CompanyApi;
  3. getData = async () => {
  4. try {
  5. const params = getParams(this.searchParams);//获取用户输入参数
  6. this.searchParams.loading = true; //加载中效果
  7. let result: IResult = await getIpInfo(params, this.page);
  8. if (result?.code !== 200) SuperNotification.error({ msg: result?.message });
  9. this.datas = result?.data?.data || []
  10. this.page.total = result?.data?.total || 0
  11. }
  12. catch (error) {
  13. SuperNotification.error({ msg: error });
  14. } finally {
  15. this.searchParams.loading = false;
  16. }
  17. }