我在Go中实现了一个Web服务,它从外部服务返回一个JSON结构。返回对象后,它看起来像这样:
{"otherServiceInfoList":[],"action...
我的Go网络服务只是将JSON读取到切片:
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")
答案 0 :(得分:2)
这是http 1.1 chunked响应。该协议将发送格式:
size-of-chunk-in-hex
chunk
...
最终的块大小为0表示响应结束。您的示例显示响应为13550字节,并在一个块中发送。
答案 1 :(得分: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
的服务设置带有chunked值的Transfer-Encoding标头来解决问题,假设您可以访问该服务api也是。如果你只是在这个中间层工作,那么你必须在编写之前自己去掉响应。如果你在Fiddler中监控的请求没有chunked
转移编码,只需添加它就可能导致Fiddler显示它与Postman中显示的相同。