如何将自定义 HTTP 标头注入 SuperAgent 发出的每个请求?

Posted

技术标签:

【中文标题】如何将自定义 HTTP 标头注入 SuperAgent 发出的每个请求?【英文标题】:How can I inject a custom HTTP Header into every request that SuperAgent makes? 【发布时间】:2015-09-12 14:21:04 【问题描述】:

显然SuperAgent 支持自定义 HTTP 标头:

request
   .post('/api/pet')
   .send( name: 'Manny', species: 'cat' )
   .set('X-API-Key', 'foobar')
   .set('Accept', 'application/json')
   .end(function(err, res)
     if (res.ok) 
       alert('yay got ' + JSON.stringify(res.body));
      else 
       alert('Oh no! error ' + res.text);
     
   );

我的问题:

如果我通过 npm 拉下 SuperAgent,如何在 SuperAgent 发出的所有请求中注入我自己的 HTTP 标头? 注意:如有必要,我完全愿意创建一个扩展 SuperAgent 的新 npm 包。

【问题讨论】:

【参考方案1】:

我只是用这样的东西制作一个单独的模块:

myagent.js

var superagent = require('superagent');

var defaultHeaders = ;
function isObject(obj)  return Object(obj) === obj; ;

function request(method, url) 
   return superagent(method, url).set(defaultHeaders);


request.set = function (field, value) 
   if (isObject(field)) 
      for(var key in field) this.set(key, field[key]);
      return this;
   
   defaultHeaders[field] = value;
   return this;

module.exports = request;

用法

var request = require('./myagent');
request.set('X-My-Header': 'foo'); // sets the default

request.get('/bar').send() // will send the default header

该模块的行为方式与 superagent 相同,但在返回 Request 对象之前设置默认标头。见here

【讨论】:

TypeError: request.get 不是函数 这对您有什么帮助?获取 TypeError: request.get 也不是函数 我认为您需要将方法提供为字符串而不是 request.get,尝试 request('get', 'url').send()【参考方案2】:

所以在我的情况下,我需要在所有请求中将 csrf 令牌设置为默认标头。你可以像这样写一个简单的包装函数。

custom-agent.js

import SuperAgent from 'superagent';

const csrfToken = document.querySelector('meta[name=csrf-token]').content;

export default 
  fire(method, url) 
    return SuperAgent[method](url).set('X-CSRF-Token', csrfToken);
  
;

像这样使用它。

import Agent from './custom-agent'

Agent.fire('get', '/endpoint')
// => SuperAgent.get('/endpoint').set('X-CSRF-Token', csrfToken)

【讨论】:

【参考方案3】:

这可能是迟到的答案,但我已使用 superagent-use 插件在所有请求中注入自定义 HTTP 标头。首先需要安装superagent-use

npm install superagent-use --save

然后像这样要求

// using plugin to intercept calls
var request = require('superagent-use')(require('superagent'));

然后将函数添加为中间件/拦截器

// interceptor used by superagent to add custom header for each request
request.use((req) => 
    req.header.custom_header = any_value;
    return req;
);

最后

request
    .get(url)
    .query( view: 'jsonView' ) // query string

【讨论】:

以上是关于如何将自定义 HTTP 标头注入 SuperAgent 发出的每个请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?

如何以角度将自定义标头添加到httpRequest

如何在 PowerShell 中运行 appCmd 以将自定义标头添加到默认网站

如何将自定义响应标头添加到来自 azure blob 的响应?

如何将自定义标头从 mvc 项目发送到 Web api 项目?

如何将自定义标头添加到zend Mail Message