【问题标题】:No content in http.Request.Body when read using Golang使用 Golang 读取时,http.Request.Body 中没有内容
【发布时间】:2015-12-22 21:27:37
【问题描述】:

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

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

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)
}

它返回一个空字符串。谷歌搜索后,我发现了一个关于这个问题的博客:Golang: Read from an io.ReadWriter without losing 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)
}

有什么建议吗?在此先感谢:)

【问题讨论】:

  • 检查返回的错误(那些你优雅省略的代码中的下划线'_')。如果您无法基于此弄清楚它们是什么,请发布它们。还要发布您如何获取传递给上述函数的http.Request(例如发布调用readBody() 函数的上下文)。
  • 哦,我忘了说我把 _ 用于所有错误只是为了简单起见。我在代码中正确处理了它们,没有发现错误。
  • 你确定真的有一个非空的身体吗?如果是:你为什么确定?
  • 我已经添加了我在问题中得到的内容,类似于ContentLength=413 with Body length 0。这是我应该进入身体的假定内容吗?是不是因为它是一个 POST 请求,所以 Body 不应该包含任何内容?
  • 所以没有正文。内容长度可能是错误的。很多请求没有正文。

标签: http go io request


【解决方案1】:

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

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 不确定您的意思?问题是询问为什么要读取 0 长度的正文,我提供了一个可能的原因。
  • 虽然这可能是真的,但由于您提供的问题,您的回答听起来不是 100% 准确。此外,它看起来有些不完整。 :)
  • 好的,我已经提出问题了。
【解决方案2】:

发生这种情况是因为您在 http 客户端执行请求并且正文已耗尽后调用 httputils.DumpRequestOut(req, true)

确保您按顺序执行以下步骤:

  1. httputils.DumpRequestOut(req, true)
  2. resp, err :=http.DefaultClient.Do(req)
  3. httputil.DumpResponse(res, true)

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 2011-09-10
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多