如何在同一个应用程序中使用具有不同baseURL的2个Axios实例(vue.js)

man*_*anu 9 javascript ecmascript-6 vue.js axios

我正在尝试学习vue.js所以我做了一个小应用程序,显示来自API的新闻文章,在另一个视图中,允许用户登录到另一个服务器.

为此,我正在使用Axios.我知道我在某些时候能够很好地工作,但今天在开始我的项目时,两个api同时工作是不可能的.

这是我的登录服务:

import axiosTrainingAPI from 'axios'

axiosTrainingAPI.defaults.baseURL = 'https://api.**********.com'

const trainingAPI = {
  login (credentials) {
    return new Promise((resolve, reject) => {
      axiosTrainingAPI.post('/services/auth.php', credentials)
        .then(response => {
          resolve(response.data)
        }).catch(response => {
          reject(response.status)
        })
    })
  }
}

export default trainingAPI
Run Code Online (Sandbox Code Playgroud)

这是我的新闻服务:

import axiosGoogleNewsAPI from 'axios'

axiosGoogleNewsAPI.defaults.baseURL = 'https://newsapi.org'

const googleNewsAPI = {
  getPosts (newsId) {
    return new Promise((resolve, reject) => {
      axiosGoogleNewsAPI.get(`/v2/everything?q=${newsId}&sortBy=publishedAt&apiKey=***********`)
        .then(response => {
          resolve(response.data)
        }).catch(response => {
          reject(response.status)
        })
    })
  }
}

export default googleNewsAPI
Run Code Online (Sandbox Code Playgroud)

这两个服务都在不同的JS文件中,并且导入到不同的vue文件中,但现在似乎它们不能共存,并且总是有一个覆盖另一个的baseURL(并不总是相同),就像Axios实例在两种情况.所以有时候第一个服务使用第二个服务的baseURL,有时它是使用第一个服务的baseURL的第二个服务...

我不确切知道'import'的范围,因为它对我来说很新,但是两个实例都在不同的文件中,有不同的名字,所以我真的不明白它们是如何混淆的.除非'import'始终调用模块的相同实例,但是如何使用2 apis?为什么它昨天有用......我很困惑.

小智 24

您可以简单地使用多个 axios 实例,每个实例都有自己的配置。例如,

import axios from "axios";
    
// For common config
axios.defaults.headers.post["Content-Type"] = "application/json";
    
const mainAxios = axios.create({
    baseURL: 'https://some-domain.com/api/'
});
    
const customAxios = axios.create({
    baseURL: 'https://some-custom-domain.com/api/'
});
    
    
export {
  mainAxios,
  customAxios
};
Run Code Online (Sandbox Code Playgroud)


Pat*_*ele 19

您需要为每个具有不同API的API 创建一个新的axios实例,其中包含自定义配置baseURL.

var instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});
Run Code Online (Sandbox Code Playgroud)

  • 顺便问一下,我们可以对不同的axios实例应用不同的拦截器吗? (2认同)

小智 6

是的,为了清楚起见:

let config = {baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {
   'X-Custom-Header': 'foobar',
    'Authorization' : `Bearer ${auth.token}` //where applicable
  }
};
let instance = axios.create(config);
Run Code Online (Sandbox Code Playgroud)

此外,您可以指定将应用于每个请求的配置默认值。

axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form- 
urlencoded';```
Run Code Online (Sandbox Code Playgroud)