【问题标题】:Node.js HTTP GET request content typeNode.js HTTP GET 请求内容类型
【发布时间】:2022-01-28 14:02:55
【问题描述】:

我正在尝试从 node.js 发出 GET 请求。这个请求是对一个 REST 服务器的,它将访问 Hbase 并返回数据。 GET 请求中包含所有必要的 Hbase 信息(表、键、列族等)。以下是代码。

var http = require('http');
var url = {
  host: '127.0.0.1',
  port: 8000,
  path: '/table-name/key/column-family',
  headers: {
    'Content-Type': 'application/octet-stream'
  },
};
http.get(url, function(resp){
  console.log("Status: " + resp.statusCode);
  console.log("Header: " + JSON.stringify(resp.headers));
  resp.setEncoding('utf8');
  var completeResponse = '';
  resp.on('data', function (chunk) {
    completeResponse += chunk;
  });
  resp.on('end', function(chunk) {
    console.log(completeResponse);
  });
});

我的问题是我得到的响应并不总是按要求提供八位字节流。大多数情况下,数据的格式都是有效的,标题如下。

{"content-length":"454","x-timestamp":"1395469504346","content-type":"application/octet-stream"}

但是,假设 10 次响​​应中的 1 次是带有如下标头的 XML 字符串。

{"content-type":"text/xml","content-length":"793"}

两种情况下的状态码都是 200,我总是请求现有的密钥。这种行为看似随机,并非由任何特定键引起。

如何确保响应始终是八位字节流而不是 XML / JSON?

【问题讨论】:

  • 以下似乎有效。 headers: { Accept: 'application/octet-stream' } 不需要内容类型。有人可以确认这是否是正确的方法吗?
  • Accept 将代替Content-Type 起作用。 Accept 是一个请求标头(您正在发送),而Content-Type 是一个响应标头,因此会随响应一起提供。

标签: node.js http rest get


【解决方案1】:

如 cmets 中所述,您需要设置 Accept 标头以指定您期望(接受)服务器响应的内容类型。请注意,您可以接受不止一种类型的回复。

Content-Type 标头指定消息正文中内容的类型。它可以由您的客户端在 POST/PATCH 请求的情况下设置,也可以由服务器在其响应中设置。在接收端,它用于知道如何处理正文内容。

更详细的可以参考综合MDN content negotiation documentation

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 2011-08-05
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多