【问题标题】:Set axios header设置 axios 标头
【发布时间】:2017-09-25 14:33:44
【问题描述】:

我有一个类似如下的课程:

import axios from "axios";

//axios.defaults.headers["Email"] = sessionStorage.getItem('email');
//axios.defaults.headers["Access-Token"] = sessionStorage.getItem('access_token');

class Api {
    // users
    static getUsers(params={}) { return axios.get("users", {params}) }
    static getUser(userId) { return axios.get("users/" + userId) }
    static updateUser(userId, data) { return axios.put("users/" + userId, data) }        

    // other resources...
}

通过阅读 Axios 文档,我发现我可以通过执行以下操作为每个请求设置标头:

axios.defaults.headers["Email"] = sessionStorage.getItem('email');
axios.defaults.headers["Access-Token"] = sessionStorage.getItem('access_token');

如果我在文件开头将这两行插入到类之外,我会收到一个错误,因为尚未设置 sessionStorage。刷新后虽然 sessionStorage 被设置,所以一切正常。

我该如何解决这个问题?我想保持 axios 调用尽可能短。

【问题讨论】:

  • access_tokens 和 email 来自哪里?
  • 我在登录后设置它们,在另一个文件中......我认为在哪里设置它们并不重要
  • 好吧,您可以将检索这些值的代码包装在一个承诺中,当检索到这些值时,您可以调用其他函数 l
  • 你能给我举个例子吗?
  • 这里是一个例子 - jsfiddle.net/yqtrrreb。在没有看到您的代码设置来检索令牌和电子邮件的情况下,提供具体答案有点困难,但希望 jsfiddle 有所帮助

标签: javascript ecmascript-6 axios


【解决方案1】:

由于您使用的是 OOP,我建议您使用构造函数和一些依赖注入来让您的生活更轻松。

使用这样的构造函数:

constructor(email, accessToken) {
  axios.defaults.headers["Email"] = email
  // same thing for accessToken
}

如果您在共享相同标题的其他地方使用 axios,我建议使用应用程序初始化 axios,一些“主要”类型的文件,设置默认值,而不是传递 email 和 accessToken像这样传递 axios 实例:

constructor(axios) {
  this.axios = axios // without importing axios
}
// and use like that
this.axios.get("users", {params})

其他建议是将 axios 实例直接传递给您的方法,例如:

static getUsers(axios, params={}) { return axios.get("users", {params}) }

我强烈建议避免在类上依赖 sessionStorage,因为您不知道它何时会加载或执行。最好是明确地告诉它来自哪里。也将更容易测试。

【讨论】:

  • 我正在使用一个库,它可以让我的 Rails 后端将一些信息传达给我的 redux 前端:ReactOnRails。该方法是由 Redux 存储初始化的方法。我知道这有点hacky,但这就是我现在得到的。以干净的方式拥有这两条信息的唯一方法是我正在使用的方法。
【解决方案2】:

试试这个:

 axios.defaults.headers.common["token"] = action.payload.data.token;

【讨论】:

【解决方案3】:

为此,您可以在axios 中使用interceptors。您可以在 then 或 catch 处理请求或响应之前拦截它们。

axios.interceptors.request.use(function (config) {
           // Do something before request is sent
           axios.defaults.headers["Email"] = sessionStorage.getItem('email');
           axios.defaults.headers["Access-Token"] = token;
           return config;
         }, function (error) {
            // Do something with request error
            return Promise.reject(error);
         });

更多详情:https://github.com/axios/axios

【讨论】:

    【解决方案4】:

    您可以在每次调用 axios 时设置标题(即使调用时间长一点:

    import axios from "axios";
    
    
    class Api {
        // users
        static getUsers(params={}) { 
          params.headers = params.headers || {}
          params.headers["Email"] = sessionStorage.getItem('email');
          params.headers["Access-Token"] = sessionStorage.getItem('access_token');
          return axios.get("users", {params}) 
        }
        static getUser(userId, params={}) { 
          params.headers = params.headers || {}
          params.headers["Email"] = sessionStorage.getItem('email');
          params.headers["Access-Token"] = sessionStorage.getItem('access_token');
          return axios.get("users/" + userId, params) 
         }
        static updateUser(userId, data, params={}) { 
          params.headers = params.headers || {}
          params.headers["Email"] = sessionStorage.getItem('email');
          params.headers["Access-Token"] = sessionStorage.getItem('access_token');
          return axios.put("users/" + userId, data, params) 
        }        
    
        // other resources...
    }

    不是最短的,但我认为它可以完成这项工作。

    希望对你有帮助。

    马克西姆

    【讨论】:

    • 我明确要求“我希望 Axios 调用保持尽可能短”
    猜你喜欢
    • 2021-07-20
    • 2018-04-11
    • 2019-10-30
    • 2017-08-18
    • 2022-10-05
    • 2018-05-24
    • 1970-01-01
    • 2017-05-01
    • 2019-04-11
    相关资源
    最近更新 更多