0

現在、Node を使用して API (Discogs API) からデータを取得していますが、リクエスト時に次のエラーが発生しました。

{ [Error: Parse Error] bytesParsed: 0, code: 'HPE_INVALID_CONSTANT' }

このリンクを使用: http://api.discogs.com/releases/249504 (ただし、他のすべてのリクエストで同じエラーが発生しますcontent-length != actual content length)

そして、このコード:

var http  = require('http');

var options = {
  hostname: 'api.discogs.com',
  port: 80,
  path: '/releases/249504',
  method: 'GET'
};

var req = http.request(options, function(res) {
  console.log("statusCode: ", res.statusCode);
  console.log("headers: ", res.headers);

  res.on('data', function(d) {
    console.log(d);
  });
});
req.end();

req.on('error', function(e) {
  console.error(e);
});

Content-length 値は常に実際の応答バイト長よりも小さいことがわかりました。

Content-length : 2142

Actual Byte Length : 7,734 Bytes (according to https://mothereff.in/byte-counter)

Node のパーサーは非常に厳密であり、それが応答の解析に失敗する理由だと読んだことがあります。

最後に、ノードが応答を解析する直前にヘッダーを無視/変更/削除する方法があるかどうかを尋ねているので、パーサーは Content-Length を無視して作業を行うことができますか?

4

2 に答える 2

1

これは、cURL を使用しても機能しないため、無効なコンテンツの長さとは関係ありません (以下を参照)。

$ curl  http://api.discogs.com/releases/249504
curl: (52) Empty reply from server

どうやら API サーバーでは、ユーザー エージェント ヘッダーが設定されている必要があります。

var options = {
  hostname : 'api.discogs.com',
  port     : 80,
  path     : '/releases/249504',
  method   : 'GET',
  headers  : { 'user-agent' : 'foo/1.0' }
};

content-length の違いについては、2142 は gzip 圧縮された応答 ( content-encoding: gzip) のサイズであり、7734 は圧縮されていない応答のサイズです。どうやら、byte-counter テストは圧縮されていない応答のみを要求していますが、ヘッダーをチェックしたクライアントは圧縮された応答を要求しています。

于 2015-08-26T10:30:13.163 に答える