如何使用NodeJS连接从请求中提取请求http标头

Posted

技术标签:

【中文标题】如何使用NodeJS连接从请求中提取请求http标头【英文标题】:How to extract request http headers from a request using NodeJS connect 【发布时间】:2012-10-20 07:20:42 【问题描述】:

我想获取使用 Node JS 的连接库包发出的请求的“主机”标头。我的代码如下所示:

var app = connect()
  .use(connect.logger('dev'))
  .use(connect.static('public'))
  .use(function(req, res)

    var host = req.???

  )
 .listen(3000);

connect 的文档在这里,但我没有看到任何详细说明上述代码中 req 对象的 API 的内容。 http://www.senchalabs.org/connect/

编辑:请注意,成功的答案必须指向文档(我需要它来验证哪个版本提供了我正在寻找的 API)。

【问题讨论】:

【参考方案1】:

检查console.log(req)console.log(req.headers); 的输出

【讨论】:

您是如何得知 req.headers 的?该字段在哪个版本中可用? @AlexSpurling nodejs.org/api/http.html#http_request_headers。 Connect 只是扩展了 Node 的 HTTP module -- http.ServerRequesthttp.ServerResponse 的类型。在 Node 的文档中找到的属性或事件也应该在 Connect 中可用(并且进一步扩展为 Express)。 这更有意义。同样,最好知道在哪里可以找到该信息(req 的类型实际上是 http.ServerRequest)。文档似乎没有说明这一点。 req 的类型是 http.IncomingMessage 这个要点模拟 http 请求,它可能对你有用:gist.github.com/3879071【参考方案2】:
var host = req.headers['host']; 

标头存储在 javascript 对象中,标头字符串作为对象键。

同样,用户代理标头可以通过

获得
var userAgent = req.headers['user-agent']; 

【讨论】:

注意:命名的索引值是 FreakING!区分大小写 根据@Steve 关于区分大小写的评论,所有标题都是小写的。因此,如果您设置标头“Origin”(大写“O”),那么请求标头集合中的唯一元素将是带有小写“o”的“origin”。 @Steve - FWIW,标题不应该区分大小写。 Http 规范明确表示它们被视为不区分大小写。对于 Http2,它们必须小写才能传输,但这不会使它们在任何一端都区分大小写,所以我们得到的是一个有 bug 的 http 标头实现 =/.【参考方案3】:

如果您使用 Express 4.x,则可以使用 req.get(headerName) 方法,如 Express 4.x API Reference 中所述

【讨论】:

还有别名为更好命名的req.header(headerName) 不需要为像这样的基本功能引入 Express。而是在 NodeJS 中使用本机,如下所述。 nodejs.org/en/docs/guides/anatomy-of-an-http-transaction【参考方案4】:

要查看 HTTP 请求标头列表,您可以使用:

console.log(JSON.stringify(req.headers));

返回 JSON 格式的列表。


"host":"localhost:8081",
"connection":"keep-alive",
"cache-control":"max-age=0",
"accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"upgrade-insecure-requests":"1",
"user-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36",
"accept-encoding":"gzip, deflate, sdch",
"accept-language":"en-US,en;q=0.8,et;q=0.6"

【讨论】:

我发现这比上面接受的答案更有帮助。 JSON.stringify 与众不同。 Totally- 在相关说明中,您也可以这样做:require('util').inspect(req.headers, depth: null,如果您想要在 Node REPL 中获得的等价物。无论哪种方式,你都会得到一个字符串。 为什么 req.headers 没有包含在 Express 官方文档中? expressjs.com/en/api.html#req 在这里说明显而易见的事情:headerValue = req.headers['headerName']; 他们只是记录那些不是派生的属性。上面提到的 Express 文档中有一条注释:“req 对象是 Node 自己的请求对象的增强版本,支持所有built-in fields and methods。” 里面包含了一个指向 Node 文档的链接底层对象。【参考方案5】:
logger.info(headers:req.headers)

输出;

 "headers":"authorization":"Basic bmluYWQ6bmluYWQ=","content-
type":"application/json","user-
agent":"PostmanRuntime/7.26.8","accept":"*/*","postman-token":"36e0d84a-
55be-4661-bb1e-1f04d9499574","host":"localhost:9012","accept-
encoding":"gzip, deflate, br","connection":"keep-alive","content-
length":"198"

【讨论】:

【参考方案6】:

在express中,我们可以使用request.headers['header-name'],例如如果你在authorization header中设置了一个Bearer token,想要取回这个token,那么你应该写req.headers['authorization '],你会得到包含'Bearer tokenString'的字符串。

【讨论】:

以上是关于如何使用NodeJS连接从请求中提取请求http标头的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 请求调用中提取 HTTP 响应正文?

如何使用passport-jwt在nodejs中发送/提取JWT令牌?

如何从 Google Cloud Functions (nodeJS) 发送 HTTP 请求

NodeJS 应用程序如何使用 HTTP 请求从禁用的 CORS(跨域共享)服务器访问资源?

Nodejs 从 http 请求块中读取 JSON 数据

使用脚本从客户端发送 http post 并在 NODEJS 中获取请求