猿问

使用 Golang 读取时 http.Request.Body 中没有内容

注意:为简单起见,省略了所有错误处理代码。我在本地处理它们,没有产生错误。


在 Golang 中,我尝试使用下面的代码http.Request.Body从 POST 请求中读取 a :


func readBody(req *http.Request) string {

    bytes, _ := httputils.DumpRequestOut(req, true)

    return string(bytes)

}

它显示了一个非零的 Content-Length,但没有返回任何内容:


ContentLength=413 with Body length 0

. 我尝试了下面的代码,也没有运气:


func readBody(req *http.Request) string {

    bytes, _ := ioutil.ReadAll(req.Body)

    return string(bytes)

}

它返回一个空字符串。google了下,找到了一篇关于这个问题的博客:Golang: Read from an io.ReadWriter without lost its content。我试图遵循模式,但仍然没有运气:


func readBody(req *http.Request) string {

    bodyBytes, _ := ioutil.ReadAll(req.Body)

    // Restore the io.ReadCloser to its original state

    req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

    // Use the content

    return string(bodyBytes)

}

有什么建议?提前致谢 :)


浮云间
浏览 841回答 2
2回答

繁花如伊

如果请求不包含适当的“Content-Type”标头,当您尝试阅读它时,您可能会看到长度为 0 的正文。

大话西游666

发生这种情况是因为您httputils.DumpRequestOut(req, true)在 http 客户端执行请求并且正文耗尽后调用。确保按顺序执行以下步骤:httputils.DumpRequestOut(req, true)resp, err :=http.DefaultClient.Do(req)httputil.DumpResponse(res, true)
随时随地看视频慕课网APP

相关分类

Go
我要回答