使用restify设置content-type标头会导致application / octet-stream

时间:2015-02-23 18:27:51

标签: node.js restify

我正在尝试restify,尽管我对Express更加满意,但到目前为止它还非常棒。我试图在响应中设置内容类型标题,如下所示:

server.get('/xml', function(req, res) {
    res.setHeader('content-type', 'application/xml');
    // res.header('content-type', 'application/xml'); // tried this too
    // res.contentType = "application/xml"; // tried this too
    res.send("<root><test>stuff</test></root>");
});

但我得到的回复是application/octet-stream

我也试过了res.contentType('application/xml')但实际上却犯了一个错误("Object HTTP/1.1 200 OK\ has no method 'contentType'")。

在响应中将内容类型标头设置为xml的正确方法是什么?

更新

当我console.log(res.contentType);时,它实际输出application/xml。为什么它不在响应标题中?

Curl片段:

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /xml?params=1,2,3 HTTP/1.1
> User-Agent: curl/7.39.0
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: application/octet-stream
< Content-Length: 8995
< Date: Mon, 23 Feb 2015 20:20:14 GMT
< Connection: keep-alive
< 
<body goes here>

4 个答案:

答案 0 :(得分:13)

原因是失败的原因是因为我没有使用Restify的响应处理程序发送响应;它默认为本机Node.js处理程序。

我这样做的地方:

res.send(js2xmlparser("search", obj));

我应该这样做:

res.end(js2xmlparser("search", o));
//  ^ end, not send!

答案 1 :(得分:2)

  

当我做console.log(res.contentType);它实际上输出application / xml。为什么它不在响应标题中?

你所做的就是在res对象上设置一个属性。因为这是JavaScript,它可以正常工作,你可以读回属性值,但这不是任何节点核心或解析的正确API,所以除了代码之外的其他所有内容都会忽略它。

根据您链接到的解析文档,您的res.header("Content-Type", "application/xml");看起来对我不对。因此,我的预感是你的工具可能会误导你。您确定在响应中看到原始值(许多开发人员工具无益于“美化”或以其他方式欺骗您)并且您正在达到您认为自己的路线吗? curl -vhttpie --headers的输出会有所帮助。

答案 2 :(得分:1)

可以通过在创建服务器时向服务器实例添加格式化程序来返回application / xml:

var server  = restify.createServer( {
   formatters: {
       'application/xml' : function( req, res, body, cb ) {
           if (body instanceof Error)
              return body.stack;

           if (Buffer.isBuffer(body))
              return cb(null, body.toString('base64'));

           return cb(null, body);
       }
  } 
});

然后在代码的某些部分:

res.setHeader('content-type', 'application/xml');
res.send('<xml>xyz</xml>');

请看一下:http://restify.com/#content-negotiation

答案 3 :(得分:0)

您可以使用sendRaw代替发送发送XML响应。 sendRaw 方法根本不使用任何格式化程序(您需要对响应进行预格式化)。请参见下面的示例:

server.get('/xml', function(req, res, next) {
  res.setHeader('content-type', 'application/xml');
  res.sendRaw('<xml>xyz</xml>');
  next();
});