如何拦截NodeJS中的第三方http请求?

时间:2016-04-09 13:49:15

标签: node.js express

我需要在NodeJS中调用第三方API服务器,如下所示,我需要在from pyspark.sql.types import StructField, DoubleType StructField( "label", DoubleType(), False, {"ml_attr": { "name": "label", "type": "nominal", "vals": ["0.0", "1.0", "2.0"] }} ) 方法中使用reqresp

由于我需要使用很多API,因此每次使用request()时我都不希望set headersset response cookies

我可以做些什么来拦截request()

request()

3 个答案:

答案 0 :(得分:1)

我的团队最近写了一篇关于在Node.js中拦截HTTP请求的博客。所介绍的方法并非特定于request软件包,而是适用于任何软件包。继续阅读:https://blog.bearer.sh/http-api-instrumentation-nodejs/

答案 1 :(得分:0)

如果我理解正确,您希望避免每次都将相同的选项传递给request

您可以简单地创建一个辅助函数,为您调用它:

function apiRequest(url, req, cb) {
  request({
  url: url,
  method: "POST",
    json: true,
    headers: {'session_id' : req.cookies.session_id},
    body: {
        "tel": req.body.tel, "code": req.body.code,
        "password": req.body.passwd, "referee": req.body.recommend
    }
  }, cb)
}

// Your previous code becomes
router.post('/register', function (req, resp) {
  apiRequest("/user/register", req, function (err, response, body) {
    resp.cookies('session_id', response.headers['sessionId'])
    resp.json(body)
  })
});

当然,如果您为此添加错误处理会更好(例如,检查req是否未定义,req.body.X是否存在等等。)

答案 2 :(得分:0)

不是很优雅,但你总是可以围绕请求

创建自己的包装器

e.g。

myrequest.js

var request = require('request');

exports.postJsonWithCookie = function(url, payload, req, resp) {
  request({
    url: url,
    method: "POST",
    json: true,
    headers: {'session_id' : req.cookies.session_id},
    body: payload
  }, function (error, response, body) {
    resp.cookies('session_id', response.headers['sessionId'])
    resp.json(body)
  });
}

然后在你的路线定义中你可以做

var request = require('./myrequest');

router.post('/register', function (req, resp) {
  var payload = {
    "tel": req.body.tel, 
    "code": req.body.code,
    "password": req.body.passwd, 
    "referee": req.body.recommend
  }
  request.postJsonWithCookie("/user/register", payload, req, resp);
});