我的网络服务器上有一个页面设置,带有一个“电子邮件地址”框和一个提交按钮。我有它,所以当它提交时,它发送一个发布请求,以检查它是否存在于我的数据库中。我一直在使用Go尝试发送此POST请求。但是,我需要按以下方式发送请求正文:
demo_mail=<email>
我还没有发现任何对远程有用的东西,只有帖子询问如何使用JSON(而不是字符串)发送数据。我目前有以下代码可以运行,但是无法发送带有以上发布数据的POST请求。
req, err := http.NewRequest("POST", "<MY PAGE>", ioutil.NopCloser(bytes.NewBufferString("demo_mail=" + email)))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36")
resp, err := client.Do(req)
if err != nil {
color.Red("Error.")
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
if strings.Contains(string(body), "Success") {
fmt.Println("Email exists")
} else {
fmt.Println("Fail")
}
感谢您的帮助。
答案 0 :(得分:1)
您期望的尸体实际上已正确发送,但可能不是您想要的方式>
POST /foo HTTP/1.1
...
Transfer-Encoding: chunked
...
Content-Type: application/x-www-form-urlencoded
...
17
demo_mail=<foo@bar.com>
0
由于您已经将字符串包装到io.NopCloser
中,因此将假定该长度不是预先知道的。因此,它将使用分块传输编码来发送从io.Reader
返回的每个块,该块以其长度为前缀,并且一旦所有操作都完成了长度为0的最后一个块。
如果您不希望出现这种情况,则需要提供一个预先知道长度的缓冲区。只需删除ioutil.NopCloser
周围的bytes.NewBufferString
即可完成:
req, err := http.NewRequest("POST", "<MY PAGE>", bytes.NewBufferString("demo_mail=" + email))
此请求将使用Content-length
而不是分块传输编码,并且正文将仅包含字符串:
POST /foo HTTP/1.1
...
Content-Length: 23
...
Content-Type: application/x-www-form-urlencoded
...
demo_mail=<foo@bar.com>