2

我正在调用一个 API,它在标头中返回 5 个键,包括标头中的Transfer-encoding :chunked 和Content-Length值。

根据stackoverflow问题,以及下面的这个,这是非法的:

“...Node.js 服务器在使用端点时返回带有代码 HPE_UNEXPECTED_CONTENT_LENGTH 的解析错误,因为响应标头包含 Transfer-encoding:chunked 和 Content-Length 值。这被认为存在 RFC 7230 第 3.3 节中指定的错误.3.3:如果接收到的消息同时带有 Transfer-Encoding 和 Content-Length 头字段,则 Transfer-Encoding 覆盖 Content-Length。这样的消息可能表示尝试执行请求走私(第 9.5 节)或响应拆分(第 9.4 节)并且应该作为错误处理。发送方必须在将此类消息转发到下游之前删除接收到的 Content-Length 字段。(1)

我正在使用 node.js 和 npm-request 模块来发送请求并尝试解析响应。被调用的函数是

function createPostAPI(req, res, userid, detailText, title, location, custImpact){
 var myJSONObject = {
    "userId" : userid,
    "apiKey" : "{API-Key}",
    "detail" : {
      "detailText" : detailText
    },
    "info" : {
      "title":title
      "location" : location,
      "priority" : 0,
      "customerImpact" : custImpact
    }
  }   

  request1({
    url: "http://theAPIurl", 
    method: "POST",
    body:JSON.stringify(myJSONObject)
    json: true,   // <--Very important!!!
    body: myJSONObject    
  }, function (error, response, body){          
      console.log(error);
      console.log(response);
      console.log(body);          
  });
}

这是我得到的预期错误:

{ Error: Parse Error
at Error (native)
at Socket.socketOnData (_http_client.js:362:20)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:547:20) bytesParsed: 194, code: 'HPE_UNEXPECTED_CONTENT_LENGTH' }

但是,我可以看到 API 调用正在运行,因为我可以直观地验证它是否正在运行!也使用 Postman 我可以看到我需要的响应!

邮递员回应:

具有 2 个标头(内容长度和传输编码)的标头: 在此处输入图像描述

我可以看到返回的响应正文: 正文通过邮递员正确返回

所以最后我的问题是,我能从我这边(客户端)做些什么来避免错误并从服务器读取 http 响应(即使格式错误)?为什么我可以在 Postman 中看到尸体?任何想法将不胜感激!

使用节点 v6.10.3

参考:(1)https://jira.spring.io/browse/SPR-15212

4

0 回答 0