【问题标题】:Dynamically Set header for all requests ( React, super-agent )为所有请求动态设置标头(反应,超级代理)
【发布时间】:2018-12-15 07:00:15
【问题描述】:

我想要一种优雅的方式来为所有请求动态设置身份验证标头。我目前的解决方案是使用 superagent-defaults 包,但它不处理动态标头

获取下面的示例代码

superagentWrapper.js

import defaults from 'superagent-defaults';
import localStorage from 'localStorage';

const superagent = defaults();

superagent
  .set('Authorization', `Bearer ${localStorage.getItem('access_token')}`);

export default superagent;

api.js

  import request from '../../../utils/superagentWrapper';

  ExampleAuthenticatedCall: (x) => {
    return new Promise((resolve, reject) => {
      request
     .post(sources.exampleCall())
     .accept('json')
     .set('Content-Type', 'application/json')
     .timeout(40000)
     .send({ exampleCall: "xxx"})
     .end((error, res) => {
        res.body.error ? reject(res.body.error) : resolve(res.body);
     });
    });
  },

所以问题是在页面加载时我的所有 api 文件都需要我的 superAgentWrapper。这意味着只要 access_token 永不更改,该示例就可以正常工作(在页面刷新之前它可能会多次更改)。

我在https://www.crowdsync.io/blog/2017/10/16/setting-defaults-for-all-your-superagent-requests/ 找到了解决此问题的方法。

虽然这可能有效,但理想的解决方案是动态镜像请求库具有的所有方法,而不是手动定义它们(将来可能会添加/删除新方法,因此这种方法有点脆弱)。

也许任何人都可以为我指出正确的方向,也许可以通过使用代理/反射来实现?

【问题讨论】:

    标签: javascript reactjs http superagent


    【解决方案1】:

    使用标准的superagent,而不是返回相同的请求,而是返回一个生成新请求的函数,并从localStorage获取当前令牌:

    import request from 'superagent';
    import localStorage from 'localStorage';
    
    const superagent = () => request
      .set('Authorization', `Bearer ${localStorage.getItem('access_token')}`);
    
    export default superagent;
    

    用法(见request and promises):

    import request from '../../../utils/superagentWrapper';
    
    AuthenticatedCall: (x) => request() // generate a new request
      .get(sources.AuthenticatedCall(x)) // a request returns a promise by default
    

    如果您不想将包装器转换为函数,您可以使用proxyget handler。每当调用代理时,代理都会使用当前令牌生成一个新请求:

    import request from 'superagent';
    import localStorage from 'localStorage';
    
    const handler = {
      get: function(target, prop, receiver) {
        return request
          .set('Authorization', `Bearer ${localStorage.getItem('access_token')}`)[prop];
      }
    };
    
    const requestProxy = new Proxy(request, handler);
    
    export default requestProxy;
    

    用法(见request and promises):

    import request from '../../../utils/superagentWrapper';
    
    AuthenticatedCall: (x) => request // generate a new request
      .get(sources.AuthenticatedCall(x)) // a request returns a promise by default
    

    【讨论】:

    • 理想情况下,我会尽量避免更改我们拥有的 200-300 多个请求。这是关于承诺被返回的一个公平点,我刚刚继承了一个包含许多类似请求的代码库,所以我会在某个时候开始对它们进行大扫除。
    • 我添加了一个基于代理的解决方案(未经测试),它应该可以满足您的需求。请注意,IE 和其他浏览器的旧版本不支持代理。
    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2017-07-15
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多