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

18

很显然,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头?
  • 注意:如果必要的话,我完全可以创建一个新的npm包来扩展SuperAgent。
3个回答

25

我会创建一个独立的模块,并编写类似以下代码:

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 对象之前设置默认标头。请参见此处


1
类型错误:request.get 不是一个函数。 - Sunil Garg
那个对你有用吗?同时出现 TypeError: request.get 不是一个函数。 - Yazan Jaber
我认为你需要提供一个字符串作为方法,而不是使用request.get。尝试使用request('get', 'url').send()。 - Souparno

10

这可能是一个晚回答,但我已经使用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

4

在我的情况下,我需要将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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接