【问题标题】:Issue HTTP GET with form values in Go [duplicate]在 Go 中使用表单值发出 HTTP GET [重复]
【发布时间】:2018-05-11 00:21:14
【问题描述】:

我看到有一种简单的方法可以发送带有表单值的帖子,但是我可以使用一个函数来完成与PostForm 基本相同的功能,但对于 GET 请求?

-- 编辑--

基本上,我想构造 URL:https://uri.com?key=value 但不使用未转义键和值的字符串连接。

【问题讨论】:

  • 您想将表单作为请求正文发送(对于 GET 请求,服务器通常会忽略它)还是将表单作为查询参数发送?
  • @ThunderCat 作为查询参数
  • @EatonEmmerich 请注意,这不称为表单或与帖子相关的任何内容,您只想构造一个查询字符串。见Go doing a GET request and building the Querystring
  • @nos 表格是否暗示数据在正文中?

标签: http go


【解决方案1】:

使用Values.Encode 对查询参数进行编码。连接基本 URL 和查询参数以获取实际 URL。

resp, err := http.Get(fmt.Sprintf("%s?%s", baseURL, data.Encode()))

【讨论】:

  • 谢谢,net/url 值是缺失的链接!此外,这个比重复的答案短
【解决方案2】:

正如in this question 解释的那样,您可能实际上并不想这样做。大多数服务器不会对GET 请求中的表单主体做任何有用的事情——而且大多数服务器只会将其视为与查询字符串中发送的相同参数的同义词,在这种情况下,您应该将它们放在查询中首先是url.URL 对象的字符串。

但是,如果您确实有充分的理由这样做,您可以。正如您链接的文档所解释的那样,PostForm 只是NewRequestDo 的一个简单的便利包装。就像您希望自己使用 NewRequest 如果您想添加自定义标头一样,您可以使用它来附加正文。

如果您查看the source to PostForm,这非常简单:

return c.Post(url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))

基本上,而不是这个:

resp, err := client.PostForm(url, data)

……你这样做:

body := strings.NewReader(data.Encode())
req, err := http.NewRequest("GET", url, body)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req)

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2015-11-10
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多