vue封装请求接口

在这里插入图片描述

axios请求的相关代码放置于:src→api→index.js. indext.js基于axios的封装,便于处理统一处理POAT,GET等请求参数,请求头,以及错误提示信息等。具体可以参考:和服务端进行交互 | vue-element-admin。或者https://github.com/PanJiaChen/vue-element-admin/blob/master/src/utils/request.js

//小demo说明
import axios from 'axios'  //导出一个axios的实例,并且这个实例要有请求拦截器,响应拦截器
const service = axios.create()      //创建一个axios的实例
service.interceptors.request.use()  //  请求拦截器
service.interceptors.response.use() // 响应拦截器
export default service  //导出axios实例

下面我们看index.js文件中的写法实例

import axios from "axios";
import { Message, Loading, MessageBox } from "element-ui";
import { apiUrl, getConterntUrl } from "../utils/util";
import { contentUrls } from "@/utils/contentApi.js"
// const baseCon = require("base/config");
var baseUrl = "",
    loading = Loading.service({
        lock: true,
        text: "加载中",
        spinner: "el-icon-loading",
        customClass: "loading-icon",
        background: "rgba(0, 0, 0, 0.8)",
    });
loading.close();
console.log('process.env.VUE_APP_CURENV', process.env.VUE_APP_CURENV);
switch (process.env.VUE_APP_CURENV) {
    case "development":
        baseUrl = ""
         "https://cloudhospital.taikang.com"
        break;
    case "test":
        baseUrl = "";
        break
    case "train": // 培训环境
        //https://cloudhospital.taikang.com/cloudhospital-train/
        baseUrl = "";
        break
    case "production":
        baseUrl = "https://tkih.mobile.taikang.com"; //生产环境url
        break;
    case "hainan":
        baseUrl = "https://ih.tkzhyl.com"; // 海南生产环境url
        break;
}

//  请求接口基础路径
axios.defaults.baseURL = baseUrl; //测试域名

axios.defaults.timeout = 200000;//请求超时

index.js文件请求拦截器中

axios.interceptors.request.use(
    (config) => {
	 if (config.url.indexOf('/tshomapp/pc/medical/getOrderChannelList') > -1 ||
            config.url.indexOf('/tshomapp/pc/medical/getWorkGroupList') > -1) {
            config.url = '/cloudhospital' + config.url; // 测试环境
            console.log(55555, config.url);

        } else if (contentUrls.includes(config.url) || contentUrls.includes(config.url.split('?')[0])) {
            config.url = getConterntUrl + config.url; // 测试环境
            console.log(44, config.url);

        } else {
            config.url = apiUrl + config.url; // 测试环境
        }
        return config;
    },
    (err) => {
        loading.close();
        Message({
            message: "请检查您的网络连接并重试",
            type: "warning",
            duration: 2000,
            customClass: "sucMsg",
            center: true,
        });
        return Promise.reject(err);
    }
})

index.js文件中响应拦截器

axios.interceptors.response.use(
    (res) => {
        loading.close();
        if (res.status == 200) {
            if (
                res.data.code == "5002" ||
                res.data.code == "BT5002" ||
                res.data.code == "BT5033" ||
                res.data.code == "BD2003"
            ) {
                MessageBox.alert(res.data.msg, "提示", {
                    confirmButtonText: "去登录",
                    type: "warning",
                }).then(() => {
                    sessionStorage.removeItem("token");
                    switch (process.env.VUE_APP_CURENV) {
                        case 'development':
                            window.location.href = "/";
                            break;
                        case 'test':
                            window.location.href = "/control-html/index.html#/";
                            break;
                        case 'train':
                            window.location.href = "/control-html-train/index.html#/";
                            break;
                        case 'production':
                            window.location.href = "/control-html/index.html#/";
                            break;
                    }

                });
            }
            return res.data;
        } else {
            Message({
                message: "请检查您的网络连接并重试",
                type: "warning",
                duration: 2000,
                customClass: "sucMsg",
                center: true,
            });
        }
    },
    (err) => {
        loading.close();
        Message({
            message: "请检查您的网络连接并重试",
            type: "warning",
            duration: 2000,
            customClass: "sucMsg",
            center: true,
        });
        return Promise.reject(err);
    }
);

最后index.js中export default axios;结尾

export default axios

下面就要关联API.js文件页面进行封装

import axios from "./index";
// import {getToken,getItem} from '@/utils/util'
export function api(url, method, request, other, header,responseType) {
  let headers = Object.assign({
    Authorization: "",
    token: ""
  },header);
  if (sessionStorage.getItem("token")) {
    // headers = {
    //    Authorization: "Bearer " + sessionStorage.getItem("token"),
    //    token: sessionStorage.getItem("token")
    //  }; 
      headers.Authorization = "Bearer " + sessionStorage.getItem("token");
      headers.token = sessionStorage.getItem("token");
    } else {
      delete headers.Authorization
      delete headers.token
    }
    if(request && request.isShare){
    // if(request && request.token){
      headers.Authorization = "Bearer " + request.token;
      headers.token = request.token;
    }
    console.log(5555,request);
    
  if (method == "post") {
    return axios({
      url: url,
      method: method,
      params: other ? other : "",
      data: request,
      headers:headers,
      responseType:responseType
    }).then((res) => {
      return res;
    });
  } else {
    return axios({
      url: url,
      method: "get",
      params: request,
      headers:headers,
      responseType:responseType
    }).then((res) => {
      return res;
    });
  }
}

xxx.vue文件中引用并调接口

<script>
import { api } from "@/api/API";
import axios from 'axios';
export default {
	data(){
	},
	mounted(){
		this.getConsultOf30DaysCode();
	},
	methods:{
	//调接口的方法
		getConsultOf30DaysCode(){
            let params = {
                "queryTime":this.reportDate,
                "serviceOrgId":JSON.parse(sessionStorage.getItem('currentOrg')).serviceCd
            }
            let response = api("/tshomapp/pc/medical/getConsultOf30Days", "post", params);
            response.then(res => {
                if(res.code == 0){
                    this.getConsultOf30DaysList = res.data;
                }
            })
        },
	}
}
</script>
Vue 3 封装请求接口通常是通过创建一个通用的请求模块来完成的,这个模块会依赖于某个 HTTP 客户端库,例如axios。封装请求接口可以让我们在不同的组件中以统一的方式调用 API,同时也可以集中处理错误、加载状态和配置信息等。 以下是一个简单的 Vue 3 封装请求接口的示例步骤: 1. 安装axios库: ``` npm install axios ``` 2. 创建一个`api`目录,在其中创建一个`request.js`文件来封装请求函数。 3. 在`request.js`中编封装请求的代码,例如: ```javascript import axios from 'axios'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // API的base_url timeout: 5000 // 请求超时时间 }); // 请求拦截器 service.interceptors.request.use( config => { // 在这里可以添加一些请求头信息,例如token等 return config; }, error => { console.error(error); // 对请求错误做些什么 return Promise.reject(error); } ); // 响应拦截器 service.interceptors.response.use( response => { const res = response.data; // 根据不同状态码进行不同的错误处理 if (res.code !== 200) { // 对响应数据做点什么 console.log('Error: ' + res.message); return Promise.reject(new Error(res.message || 'Error')); } else { return res; } }, error => { console.error(error); // 对响应错误做点什么 return Promise.reject(error); } ); export default service; ``` 4. 在需要使用API的组件中导入封装好的请求模块,并进行请求调用,例如: ```javascript import request from '@/api/request'; export function fetchData() { return request({ url: '/some-endpoint', method: 'get' }); } ``` 通过上述步骤,我们就可以在Vue 3项目中封装并重用请求接口,同时处理了请求和响应的统一逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值