【问题标题】:How to send JSON body in GET request golang?如何在 GET 请求 golang 中发送 JSON 正文?
【发布时间】:2020-11-13 08:44:16
【问题描述】:

documentation 中没有用于 http.Client.Get 的“正文”字段

【问题讨论】:

  • GET 和 DELETE 请求没有正文。如果需要发送正文,请使用 PUT、POST、PATCH
  • @Flimzy,我倾向于认为链接的答案虽然绝对有用,但不能回答问题的本质:确实存在损坏的服务(通常是内部开发的软件),我会如果发现 OP 确实需要在 GET 请求中发送正文,不要太惊讶,因为这是他们的目标服务想要的。我会重新提出这个问题。
  • @kostix:公平点。
  • 不过,如果问题是内部服务器使用了不符合标准的标准,那么使用不符合标准创建内部客户端意味着现在有两个问题。修复服务器将是更好的长期方法。

标签: http go get payload


【解决方案1】:

HTTP 不支持使用 GET 请求发送正文。有关详细信息,请参阅this Q&A。但是如果你真的想这样做,即使你知道这是错误的,你也可以这样做:

iKnowThisBodyShouldBeIgnored := strings.NewReader("text that won't mean anything")
req, err := http.NewRequest(http.MethodGet, "http://example.com/foo", iKnowThisBodyShouldBeIgnored)
if err != nil {
    panic(err)
}
res, err := http.DefaultClient.Do(req)

【讨论】:

    【解决方案2】:
    1. 不要在 GET 请求中发送正文:an explanation

      RFC 7231 says 如下:

      GET 请求消息中的有效负载没有定义的语义; 在 GET 请求上发送有效负载正文可能会导致一些现有的 拒绝请求的实现。

    2. 如果必须,请不要使用net/http.Get,因为它只是一个便利功能。
      相反,更深入一层并构造一个适当的http.Request,然后通过在http.Client 的实例上调用Do 方法来执行(http.DefaultClient 应该没问题)。

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 2019-08-15
      • 2021-06-27
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多