自定义axios配置多个ip

news/2024/7/10 0:34:03 标签: vue, vue-cli3, 前端

这几天项目遇到一个情况:一个vue项目除了对接的后端的接口,还需要去使用统一登录平台的登录以及权限等接口,分别部署在不同服务器中;本来还一种处理方法就是后端做一次接口转发,这样我们就不需要另外配置ip了,但是由于开发任务较紧急不能额外占据更多资源,就意味着要前端自己处理(其实也非常简单)

主要思路还是创建两个axios实例,这样就能配置两个baseURL。。。。以此类推N+1都行,当然肯定也不能直接 const service = axios.create({}) const service2 = axios.create({})等等。。。

直接上代码

import axios from 'axios'
import { message } from 'com/resetMessage'
// import store from '@/store' 
let localIp = '192.168.66.11'
//port为自定义的端口号,host为自定义ip类似于localIp
export const baseUrl = (port, host) => {
  if (!port) port = '9527' //默认主要使用的是9527
  let hostname = ''
  if (host) { // 不传host就默认获取前端部署服务的ip,一般与后端地址一致
    hostname = host
    localIp = host
  } else {
    hostname = window.location.hostname
  }
  let origin = 'http://' + hostname + ':' + port
  // 主要省了配置开发环境ip(公司项目环境决定,一般面向小区或者政府-可能多个小区使用不同ip:都是泪)
  let url = 
    process.env.NODE_ENV === 'development'
      ? 'http://' + localIp + ':' + port
      : origin
  return url
}

//将axios封装到一个可配置的函数中createService
const createService = baseURL => {
  const service = axios.create({
    baseURL,
    timeout: 5000 // request timeout
  })

  service.interceptors.request.use(
    config => {
    //此处添加请求头 自定义一些字段,但是类似于汉字需要使用encodeURIComponent()进行转码
      config.headers['Content-Type'] = 'application/json;charset=UTF-8'
      config.headers['Authorization'] =
        window.localStorage.getItem('Authorization') || ''
      config.headers['realName'] =
        encodeURIComponent(window.localStorage.getItem('realName')) || ''
      return config
    },
    error => {
      Promise.reject(error)
    }
  )
  service.interceptors.response.use(
    response => {
      const res = response.data
      //下面的是个人项目与后端的约定,根据需求调整
      if (res.code && res.code !== 200) {
        message({
          message: res.message || res.error || '请求失败',
          type: 'error',
          duration: 1000
        })
        //这里请求失败我就直接message提示,前端调用接口时候不需要再次if(成功){}else{失败}判断
        //界面使用时候接口失败还会直接反馈前端一个false,直接if(data)即可,失败不需要关注处理
        Promise.reject(false)
      } else {
      //token失效情况
        if (res.code === '99998') {
          window.localStorage.clear()
        }
        //其他即为成功直接返回成功数据
        return res
      }
    },
    error => {
      console.log(error)
      message({
        message: error,
        type: 'error' || '网络错误',
        duration: 1000,
        onClose: () => {
          Promise.reject(false)
        }
      })
    }
  )
  return service
}
// 默认主要使用ip
const request = createService(baseUrl())
// 统一登录平台使用
const fetch = createService(baseUrl('2001', '192.168.x.xx'))
export { request, fetch }

使用方式参考上一篇文章第四条 http请求统一配置
如下:

import {request,fetch} from 'comJs/api'
import * as userUrl from '@/api/constant/user'
export const login = data => {
  return request({ url: userUrl.login, data, method: 'post' })
}
export const vaildLogin = data => {
  return request({ url: userUrl.vaildLogin, data, method: 'post' })
}
//这里request可以看成baseURL1   fetch为baseURL2    以此类推。。。。随意定制即可

http://www.niftyadmin.cn/n/1318611.html

相关文章

java支持的最大内存

一.jdk各个版本在不同操作系统中支持的最大内存是不一样的,但是可以通过以下方法来进行测试 c:>java -Xmxxxxxm(g) -version 其中xxxx为最大内存数值, m(g)是内存的计量单位,如果命令能够正确显示出jdk的版本等信息,说明当前…

vscode代码格式化时属性不换行

最近一直使用vscode,项目中也使用了eslint等代码格式化工具,但是自从更新之后标签属性一直换行,查询尝试了多种方法发现都已经不行,纠结好久才搞好,终于觉得编辑器清新了好多 1、需要 command,;打开设置,搜…

BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)

题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的。而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为…

上司说「看你每天准时下班就知道你工作量不饱和」,该如何回应?

问题:上司说「看你每天准时下班就知道你工作量不饱和」,如何回应 正常下班时间6点,只要是6点半前下班的,上司都认为没有加班。 Eno-Bea回答,注重感受,不一定是别人的 虽然我不知道你具体从事什么工作与职业…

Java的构造器问题

在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java的构造器问题,更多Java专业知识,广州疯狂java培训为你讲解; 1. 抽象…

前端图片上传使用,base64直接上传,base64转化成file上传,form表单直接上传文件,element-ui上传图片

最近项目中使用到了图片上传功能,作为前端开发对此应该不陌生,正常来说图片会有一个单独存储的服务,例如现在公司使用minio统一集中管理,直接部署在docker上面非常方便,下面记录一下使用经历过的图片上传 1.base64直接…

年薪50万美金的工程师到底牛在哪里?

年薪 50 万美金的工程师他们究竟做哪些事情,或是拥有哪些技术,让他们如此值钱?这些东西有办法“学”吗? 之前 Business Insider 出了一篇某个 Google 工程师拒绝年薪 50 万工作,因为 Google 每年附他 300 万美金…

文字发光效果

转载自&#xff1a;前端一点红 <div><p>xinpureZhu</p> </div> body {background: #000; } .container {width: 600px;margin: 100px auto 0; } p {font-family: Audiowide;text-align: center;color: #00a67c;font-size: 7em;-webkit-transition: a…