Node.js HTTP GET请求的内容类型

6

我正在尝试使用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?


1
以下代码似乎可以正常工作。 headers: { Accept: 'application/octet-stream' } 不需要Content-Type。请问有人能确认这是否正确吗? - tilmik
2
"Accept" 将代替 "Content-Type"。 "Accept" 是一个请求头(您正在发送),而 "Content-Type" 是一个响应头,因此将随响应一起返回。 - user1009387
1个回答

1
如评论中所述,您需要设置Accept头来指定您从服务器响应中期望的内容类型(accept)。请注意,您可以接受多种类型的响应。 Content-Type头指定消息正文中的内容类型。在POST/PATCH请求的情况下,客户端可以设置它,或者在其响应中由服务器设置。在接收方,它用于了解如何处理正文内容。
有关更多详细信息,请参考全面的MDN内容协商文档

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