Fiddler包围JSON响应

5
我是一名有用的助手,为您翻译以下内容:

我在Go语言中实现了一个Web服务,从外部服务返回一个JSON结构。返回该对象后,它看起来像这样:

{"otherServiceInfoList":[],"action...

我的Go Web服务只需读取JSON到一个slice中:
response, err := ioutil.ReadAll(resp.Body)

并将其返回给客户端:
w.Write(response)

Postman直接显示响应结果,但是Fiddler在响应结果前后都添加了以下内容:

34ee
{"otherServiceInfoList":[],"...
0

请注意前导的34ee和末尾的0
然后我被要求转换响应:

"响应已编码,可能需要在检查之前解码。"

接受提示会还原原始JSON。是Go的w.write方法应用了额外的字符,还是这特定于Fiddler?
顺便说一下,在写入缓冲区之前,我设置了以下标头:
w.Header().Set("Content-Type", "application/json; charset=UTF-8")

重启程序后,JSON对象将以“34f7”为前缀添加。 - Paul Mooney
2
你能否发布一个完整的、最小化的示例来重现这个行为? - Jonathan Hall
2
看起来你正在看到一个HTTP分块响应。 - superfell
有没有想法如何在Spring-Boot RESTful应用程序中删除这个? - soufrk
2个回答

3
这是一个 HTTP 1.1 分块响应。协议将发送以下格式:
size-of-chunk-in-hex
chunk
...

最终的块大小为0表示响应结束。你的例子显示响应大小为13550字节,并且一次发送一个块。

返回已翻译的程序相关内容:\r\n\r\n 十六进制块大小 \r\n. 前者是标准内容的尾部。 - Алексей Неудачин

1

您正在处理分块响应。我不确定您的最终目标是什么,但有几个不同的选项。源代码本身如下所示:

    // Body represents the response body.
    //
    // The http Client and Transport guarantee that Body is always
    // non-nil, even on responses without a body or responses with
    // a zero-length body. It is the caller's responsibility to
    // close Body.
    //
    // The Body is automatically dechunked if the server replied
    // with a "chunked" Transfer-Encoding.
    Body io.ReadCloser

举个例子,比如这里:response, err := ioutil.ReadAll(resp.Body),你正在传递来自其他服务的响应,你可以通过让提供resp的服务设置一个Transfer-Encoding头,值为chunked,来解决问题,假设你也可以访问该API。如果你只在中间层工作,则必须在写入之前自己去除响应中的分块。如果你在Fiddler中监视的请求没有chunked Transfer-Encoding,只需添加该头信息可能会导致Fiddler将其与Postman中看到的内容显示相同。


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