当前位置:   article > 正文

axios的使用及说明_axios 使用

axios 使用

目录

1.说明

2.直接使用

3.封装使用

4.注意


1.说明

官网:Axios 实例 | Axios中文文档 | Axios中文网

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 

在前端项目中通过axios进行发送请求,通过代理后调用后端接口,并接收返回,将返回信息显示在前端画面中。

axios返回的是一个promise。执行then方法,接收执行成功的结果,显示在画面中。执行catch 方法用于对执行异常进行处理,如弹出提示信息。执行finally方法用于进行清理工作,如关闭画面loading。

2.直接使用

①安装

npm install axios

②配置

在js或ts文件中创建请求的文件,用于设置请求的共同配置及请求拦截器和响应拦截器。

(1)导入axios

import axios from "axios";

(2)设置全局的axios的配置

通过axios的defaults进行配置。可以设置基础url,这样在api请求中只需要设置相对url;

可以配置共用的请求头,如token及其他的自定义的请求头。

也可以为某个请求配置独有的请求头属性。

  1. //配置请求的基础url
  2. axios.defaults.baseURL = 'https://api.example.com';
  3. //配置共同的请求头,所有的请求头中都带有X-request
  4. axios.defaults.headers.common['X-request'] = 'ajax';
  5. //配置post请求头,只对post请求起作用,在post请求头中设置Content-Type
  6. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

(3)配置请求拦截器及响应拦截器

请求拦截器:

  1. // 添加请求拦截器
  2. axios.interceptors.request.use(function (config) {
  3. // 在发送请求之前做些什么
  4. return config;
  5. }, function (error) {
  6. // 对请求错误做些什么
  7. return Promise.reject(error);
  8. });

方法中接收两个函数。

第一个函数是在请求前进行一个配置,如可以在请求头中添加token,进行请求url前缀的配置,请求参数的映射配置,防止数据重复提交的配置。

第二个函数是请求发送失败时的处理。

响应拦截器:

  1. // 添加响应拦截器
  2. axios.interceptors.response.use(function (response) {
  3. // 2xx 范围内的状态码都会触发该函数。
  4. // 对响应数据做点什么
  5. return response;
  6. }, function (error) {
  7. // 超出 2xx 范围的状态码都会触发该函数。
  8. // 对响应错误做点什么
  9. return Promise.reject(error);
  10. });

 方法中接收两个函数。

2xx 范围内的状态码都会触发第一个函数。response对象的结构如下,后端响应的数据存放在data中。还有就是响应的http状态信息,响应头信息,请求的配置信息及request请求信息

  1. {
  2. // `data` 由服务器提供的响应
  3. data: {},
  4. // `status` 来自服务器响应的 HTTP 状态码
  5. status: 200,
  6. // `statusText` 来自服务器响应的 HTTP 状态信息
  7. statusText: 'OK',
  8. // `headers` 是服务器响应头
  9. // 所有的 header 名称都是小写,而且可以使用方括号语法访问
  10. // 例如: `response.headers['content-type']`
  11. headers: {},
  12. // `config` 是 `axios` 请求的配置信息
  13. config: {},
  14. // `request` 是生成此响应的请求
  15. // 在node.js中它是最后一个ClientRequest实例 (in redirects),
  16. // 在浏览器中则是 XMLHttpRequest 实例
  17. request: {}
  18. }

 首先需要从data中获取后端响应的信息,对状态码进行判断,成功时,直接返回data,失败时,进行信息提示。

 超出 2xx 范围的状态码都会触发第二个函数。

示例:

在src/api下创建interceptor.ts文件,内容如下:

  1. import axios from "axios";
  2. import type { AxiosRequestConfig, AxiosResponse } from "axios";
  3. import { Message, Modal } from "@arco-design/web-vue";
  4. import { useUserStore } from "@/store";
  5. import { getToken } from "@/utils/auth";
  6. export interface HttpResponse<T = unknown> {
  7. status : number;
  8. msg : string;
  9. code : number;
  10. data : T;
  11. }
  12. //设置请求的基础url
  13. if (import.meta.env.VITE_API_BASE_URL) {
  14. axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL;
  15. }
  16. /**
  17. * 请求拦截
  18. */
  19. axios.interceptors.request.use(
  20. (config : AxiosRequestConfig) => {
  21. const token = getToken();
  22. if (token) {
  23. if (!config.headers) {
  24. config.headers = {};
  25. }
  26. //设置token及自定义请求头
  27. config.headers['token'] = token;
  28. config.headers['X-Requested-With'] = 'ajax';
  29. }
  30. // 设置请求前缀
  31. config.url = import.meta.env.VITE_APP_API_URL + config.url;
  32. return config;
  33. },
  34. (error) =>
  35. // do something
  36. Promise.reject(error)
  37. );
  38. /**
  39. * 响应拦截
  40. * todo 根据后端代码重新定制拦截逻辑
  41. */
  42. axios.interceptors.response.use((response : AxiosResponse<any>) => {
  43. const res = response.data;
  44. let resCode = res.resHdr?.resCode;
  45. let resMsg = res.resHdr?.resMsg || "请求未知异常";
  46. //判断后端借口的返回值,异常时进行报错
  47. if (resCode !== "0000") {
  48. Message.error({
  49. content: resMsg,
  50. duration: 5 * 1000
  51. });
  52. return Promise.reject(new Error(resMsg));
  53. }
  54. //返回后端接口的内容
  55. return res;
  56. },
  57. (error) => {
  58. Message.error({
  59. content: error.msg || "请求未知异常",
  60. duration: 5 * 1000
  61. });
  62. return Promise.reject(error);
  63. }
  64. );

(4)在main.js文件中导入

导入(3)中的axios配置文件

  1. import { createApp } from "vue";
  2. import ArcoVue from "@arco-design/web-vue";
  3. import ArcoVueIcon from "@arco-design/web-vue/es/icon";
  4. import globalComponents from "@/components";
  5. import router from "./router";
  6. import store from "./store";
  7. import i18n from "./locale";
  8. import directive from "./directive";
  9. import App from "./App.vue";
  10. // Styles are imported via arco-plugin. See config/plugin/arcoStyleImport.ts in
  11. // the directory for details
  12. // 样式通过 arco-plugin 插件导入。详见目录文件 config/plugin/arcoStyleImport.ts
  13. // https://arco.design/docs/designlab/use-theme-package
  14. import "@/assets/style/global.less";
  15. //导如axios的配置
  16. import "@/api/interceptor";
  17. const app = createApp(App);
  18. app.use(ArcoVue, {});
  19. app.use(ArcoVueIcon);
  20. app.use(router);
  21. app.use(store);
  22. app.use(i18n);
  23. app.use(globalComponents);
  24. app.use(directive);
  25. app.mount("#app");

(5)在各个模块的api文件中导入后进行使用

  1. import axios from "axios";
  2. import {ResponseData,RequestData} from "@/types/request";
  3. // 接口
  4. // 修改及新增的form表单接口
  5. export interface insertFormModel {
  6. bsNo: string;
  7. deptId: string;
  8. deptNm: string;
  9. bsProvinceId: string;
  10. bsProvince: string;
  11. bsCityId: string;
  12. bsCity: string;
  13. bsAddr: string;
  14. remark: string;
  15. }
  16. // 下拉选择器类型
  17. export interface selectType{
  18. value:string;
  19. label:string;
  20. }
  21. // 后端请求
  22. // 分页查询
  23. export async function listPage(params: RequestData): Promise<any> {
  24. return axios.post<ResponseData>("/tianjiannongshi/breedingStation/mb1407", params);
  25. }
  26. // 插入及更新
  27. export async function insert(params: RequestData): Promise<any> {
  28. return axios.post<ResponseData>("/tianjiannongshi/breedingStation/mb1401", params);
  29. }

发送get请求示例

  1. const axios = require('axios');
  2. // 向给定ID的用户发起请求
  3. axios.get('/user?ID=12345')
  4. .then(function (response) {
  5. // 处理成功情况
  6. console.log(response);
  7. })
  8. .catch(function (error) {
  9. // 处理错误情况
  10. console.log(error);
  11. })
  12. .finally(function () {
  13. // 总是会执行
  14. });
  15. // 上述请求也可以按以下方式完成(可选)
  16. axios.get('/user', {
  17. params: {
  18. ID: 12345
  19. }
  20. })
  21. .then(function (response) {
  22. console.log(response);
  23. })
  24. .catch(function (error) {
  25. console.log(error);
  26. })
  27. .finally(function () {
  28. // 总是会执行
  29. });
  30. // 支持async/await用法
  31. async function getUser() {
  32. try {
  33. const response = await axios.get('/user?ID=12345');
  34. console.log(response);
  35. } catch (error) {
  36. console.error(error);
  37. }
  38. }

3.封装使用

①安装

npm install axios

②配置

在js或ts文件中创建请求的文件,用于设置请求的共同配置及请求拦截器和响应拦截器。

(1)导入axios

import axios from "axios";

(2)设置全局的axios的配置(按照需要进行设置)

参照上面

(3)创建axios实例

  1. const service = axios.create({
  2. baseURL: 'http://localhost:5173', // api的base URL
  3. timeout: 5000, // 设置请求超时时间
  4. responseType: 'json',
  5. withCredentials: true, // 是否允许带cookie这些
  6. headers: {
  7. 'x-token': '777'
  8. },
  9. });

 可以在创建实例中设置基础url及请求超时时间,创建实例前设置的全局信息,在创建实例后可以进行修改,如下:

 (4)创建请求拦截器及响应拦截器

在(3)中创建了axios的实例service。通过service创建拦截器。

  1. // 添加请求拦截器
  2. service.interceptors.request.use(function (config) {
  3. // 在发送请求之前做些什么
  4. config.headers['Authorization'] = 'Bearer ' +'13123123123';
  5. console.log('请求信息:' + JSON.stringify(config))
  6. return config;
  7. }, function (error) {
  8. // 对请求错误做些什么
  9. console.log('请求失败信息'+ error)
  10. return Promise.reject(error);
  11. });
  12. // 添加响应拦截器
  13. service.interceptors.response.use(function (response) {
  14. // 2xx 范围内的状态码都会触发该函数。
  15. // 对响应数据做/o点什么
  16. return response;
  17. }, function (error) {
  18. // 超出 2xx 范围的状态码都会触发该函数。
  19. // 对响应错误做点什么
  20. return Promise.reject(error);
  21. });

最后导出axios实例。

示例:

在src/api下创建interceptor.ts文件,内容如下:

  1. import axios from 'axios';
  2. // 全局 axios 默认值
  3. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
  4. axios.defaults.baseURL = 'http://localhost:5173';
  5. axios.defaults.timeout = 5000;
  6. axios.defaults.headers.common['X-Custom-Header'] = '369852147';
  7. axios.defaults.headers.post['X-ajax'] = 'ajax';
  8. const service = axios.create({
  9. baseURL: 'http://localhost:5173', // api的base URL
  10. timeout: 5000, // 设置请求超时时间
  11. responseType: 'json',
  12. withCredentials: true, // 是否允许带cookie这些
  13. headers: {
  14. 'x-token': '777'
  15. },
  16. });
  17. // 添加请求拦截器
  18. service.interceptors.request.use(function (config) {
  19. // 在发送请求之前做些什么
  20. config.headers['Authorization'] = 'Bearer ' +'13123123123';
  21. console.log('请求信息:' + JSON.stringify(config))
  22. return config;
  23. }, function (error) {
  24. // 对请求错误做些什么
  25. console.log('请求失败信息'+ error)
  26. return Promise.reject(error);
  27. });
  28. // 添加响应拦截器
  29. service.interceptors.response.use(function (response) {
  30. // 2xx 范围内的状态码都会触发该函数。
  31. // 对响应数据做/o点什么
  32. return response;
  33. }, function (error) {
  34. // 超出 2xx 范围的状态码都会触发该函数。
  35. // 对响应错误做点什么
  36. return Promise.reject(error);
  37. });
  38. export default service;

 (5)导入axios实例进行使用

  1. import {defineStore} from 'pinia'
  2. import {ref} from 'vue'
  3. //导入axios实例
  4. import request from '@/api/interceptor';
  5. // import axios from 'axios';
  6. export const useChannelStore = defineStore('channel',() =>{
  7. // 声明数据
  8. const list = ref([]);
  9. // 声明操作数据的方法
  10. const getList = async () =>{
  11. //使用axios实例发送请求
  12. const {data:{data}} = await request.post('/v1_0/channels');
  13. list.value = data.channels;
  14. }
  15. // 声明getters相关
  16. return {
  17. list,
  18. getList
  19. }
  20. })

4.注意

①使用2中直接使用的方法,需要在main.js文件中导入axios的配置文件,在其他地方使用时依然导入axios进行使用。

②使用3中封装使用的方法,不需要再main.js中进行导入,在其他地方使用时导入创建的axio示例进行使用。

③创建自定义请求头中必须使用中划线,不能使用下划线,使用下划线需要在nginx中添加额外的配置让下划线生效,默认是忽略下滑线的。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/784025
推荐阅读
相关标签
  

闽ICP备14008679号