[axios]未针对 application/json 处理传输编码分块

2024-02-21 523 views
5
概括

我通过分块编码接收 JSON。response.data返回为string. 它没有按照标题的指示正确解析。我希望能得到一个 JSON 对象res.data

响应标头:

Content-Type: application/json
Transfer-Encoding: chunked, chunked

响应数据:

23\r\n
{"rejected":0,"inserted/updated":1}\r\n
0\r\n
\r\n
\r\n

理论上,这个响应也是有效的:

18\r\n
{"rejected":0,"inserted/update\r\n
5\r\n
d":1}\r\n
0\r\n
\r\n
\r\n
语境
  • axios版本:例如:0.18.0
  • 环境:例如:node v8.10.0、High Sierra

回答

6

需要在线演示。

9

@OpenGG 嗯,我不知道如何去做,因为这个 API 不是我的,而且我没有随机服务器来生成端点来返回这个值。我使用的 API 是经过身份验证的 API,我无法将 API 密钥放入测试脚本中。有什么建议么?

9

那么response.data作为分块编码数据的字符串返回?这真的很奇怪。

7

我刚刚玩了一个 axios 单元测试来探索这一点,发现:

  • 测试通过了Transfer-Encoding: chunked
  • 测试显示了与 @DaveStein 的描述相同的不良行为 Transfer-Encoding: chunked, chunked

我认为这是底层传输的问题(即nodejs内置http模块)

0

您能验证这是否仍然是一个问题吗?

7

会派人来检查一下。我们当前的黑客如下。我们总是会回来res.data看看会发生什么:)但就像我上面说的,不确定这chunked, chunked是否有效。

function getData(res) {
  const transferEncoding = res.headers['transfer-encoding'];
  if (!transferEncoding || transferEncoding !== 'chunked, chunked') {
    return res.data;
  }

  const splitString = res.data.split('\r\n');
  return JSON.parse(splitString[1]);
}
0

我同事说这个问题已经解决了v0.19.0-beta.1

6

哎呀,对不起。错误。在测试版中仍然存在问题。

2

我有类似/相同的问题。

GET 请求是一个对象,但对https://engineersf.com/wp-json 的https://wpdemo.gatsbycentral.com/wp-json result.data请求是一个 result.datastring

两个服务器返回不同的标头并具有不同的内容长度

2

我有同样的问题。

我正在使用axios从带有标头响应的服务器获取 JSON 数据Transfer-Encoding: chunked

当我尝试解析 JSON 时,出现以下错误:

(node:14940) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token F in JSON at position 1

响应数据以无人值守字符开头和结尾,如下所示:

7F5
{
  "message": "OK"
  ....
}
0

该字符串无法由JSON.parse()函数解析。

我已经用 进行了这个测试latest master commit

有可用的测试版来解决这个问题吗?

2

我使用正则表达式来解决这个问题。

const chunksParser = body => {
  return body
    .replace(/^(\w{1,3})\r\n/, "") // remove initial chunks info
    .replace(/\r\n(\w{1,3})\r\n/, "") // remove in-body chunks info
    .replace(/(\r\n0\r\n\r\n)$/, ""); // remove end chunks info
};

详细信息请参见StackOverflow 帖子

3

我只留下了上面发布的修复程序。

8

关闭,合并于#2419

4

@jasonsaayman,您好,新的 1.2.0 版本似乎在这个主题上出现了回归。在 1.1.3 版本中,这个问题仍然被修复,但现在又被破坏了。

2

你好,我也看到了这个:分块响应 ara 处理不好(获取乱码字符串而response.data不是 JSON 对象)。恢复修复1.1.3该问题。

8

我在处理回复时遇到了完全相同的问题transfer-encoding: chunked。目前正在恢复以1.1.3避免此问题。

6

axios@1.2.0出现同样的异常transfer-encoding: chunked,并恢复到 v1.1.3 将正常工作。

2

我面临同样的问题并恢复v1.1.3工作。

请注意,我必须npm uninstall先然后npm install axios@1.1.3

感谢上面的回答

6

同样,从 1.2.0 恢复到 1.1.3 修复了它。

8

我认为值得一提的是,即使降级到 1.1.3,如果你有选择,decompress: false它仍然无法工作。

1

可以确认,只需降级到 1.1.3 即可修复此问题。

4

在 chunked 中text/html也遇到过这个问题,并通过降级到 1.1.3 来解决。所以这个问题似乎并不局限于application/json.

4

类似的问题。从 1.2.1 降级到 1.2.0 以修复 brotli 编码问题,然后使用 cloudflare 遇到了同样的问题,这似乎使我的 json 响应分块

1

可以确认从 1.2.0 降级到 1.1.3 修复了从节点中读取响应到 azure 函数的问题