美文网首页
React拦截器以及代理设置

React拦截器以及代理设置

作者: 郭先生_515 | 来源:发表于2020-09-23 16:24 被阅读0次

设置拦截器封装axios的get post请求:

初始化项目后,我们在src目录下创建utils文件夹,内包含api.js和http.js两个文件。

api.js 主要包含我们请求后台的接口地址,简单举个例子:

let api = {
    home: '/api/home/content',
    login: `/api/sso/login`,
    ...
}

export default api

接下来,就是封装axios的http.js:首先我们需要安装axios的依赖:

yarn add axios -D or npm i axios -D

安装完成依赖之后,就需要在http.js中引入:

import axios from "axios";

let baseUrl = 'https://192.168.0.125:8085'

// 创建axios实例,在这里可以设置请求的默认配置
const instance = axios.create({    
    timeout: 10000, // 设置超时时间10s
    baseURL: baseUrl   // 根据自己配置的反向代理去设置不同环境的baseUrl
})
// 文档中的统一设置post请求头。下面会说到post请求的几种'Content-Type'
instance.defaults.headers.post['Content-Type'] = 'application/json'

/** 添加请求拦截器 **/
instance.interceptors.request.use(config => {
    config.headers['token'] = sessionStorage.getItem('token') || ''
    return config
}, error => {
    // 对请求错误做些什么
    return Promise.reject(error)
})

/** 添加响应拦截器  **/
instance.interceptors.response.use(response => {
    // console.log(response)
    // 响应结果里的 statusText: ''是我与后台的约定,大家可以根据实际情况去做对应的判断
    if (response.statusText === '') {     
        return Promise.resolve(response.data)
    } else {
        return Promise.reject(response.data.message)
    }
}, error => {
    if (error.response) {
        // token或者登陆失效情况下跳转到登录页面,根据实际情况,在这里可以根据不同的响应错误结果,做对应的事。这里我以401判断为例
        if (error.response.status === 401) {    
            //针对框架跳转到登陆页面
            this.props.history.push('/login');
        }
        return Promise.reject(error)
    } else {
        return Promise.reject('请求超时, 请刷新重试')
    }
})

/* 统一封装get请求 */
export const get = (url, params, config = {}) => {
    return new Promise((resolve, reject) => {
        instance({
            method: 'get',
            url,
            params,
            ...config
        }).then(response => {
            resolve(response)
        }).catch(error => {
            reject(error)
        })
    })
}

/* 统一封装post请求  */
export const post = (url, data, config = {}) => {
    return new Promise((resolve, reject) => {
        instance({
            method: 'post',
            url,
            data,
            ...config
        }).then(response => {
            resolve(response)
        }).catch(error => {
            reject(error)
        })
    })
}

封装完get post请求之后,我们需要在react的原型链上,绑定get和post方法,修改 src/index.js 文件:

import React, { Component } from 'react';
import { get, post } from './utils/http';
import api from './utils/api';

// 注意:Vue 框架是在Vue.prototype原型上绑定,而react不是在React.prototype原型上绑定,而是在Component上绑定

Component.prototype.get = get;
Component.prototype.post = post;
Component.prototype.api = api;

最后就是接口的请求,上一篇文章有所提及,按照要求请求接口即可。

Tips: 在接口的请求过程中,可能会遇到跨域的问题,接下来解决跨域的问题:
首先,跨域我们需要用到 http-proxy-middleware 这个中间件,去设置代理

yarn add http-proxy-middleware -D or npm i http-proxy-middleware -D

然后我们需要在src目录下新建setupProxy.js文件:

// 新版舍弃了proxy,采用的是 createProxyMiddleware 
const { createProxyMiddleware } = require("http-proxy-middleware");
 
module.exports = function(app) {
    app.use("/api",
        createProxyMiddleware({
            target: "https://192.168.0.125:8085",                   // 跨域地址
            changeOrigin: true,
            pathRewrite: {
                "^/api": ""
            }
        })
    );
};
// dva代理设置
{
    "proxy": {
        "/apis": {
            "target": "https://192.168.0.1:8085",                   // 跨域地址
            "changeOrigin": true,
            "pathRewrite": {
                "^/apis": ""
            }
        }
    }
}

到此,我们就可以跨域请求后台接口地址。

相关文章

网友评论

      本文标题:React拦截器以及代理设置

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