我在我的网络服务器上设置了一个页面,其中包含一个“电子邮件地址”框和一个提交按钮。我有它,所以当它被提交时,它会发送一个发布请求来检查它是否存在于我的数据库中。我一直在使用 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") }任何帮助表示赞赏。
1 回答
眼眸繁星
TA贡献1873条经验 获得超9个赞
您期望的正文实际上已正确发送,但可能不是您想要的方式:
POST /foo HTTP/1.1
...
Transfer-Encoding: chunked
...
Content-Type: application/x-www-form-urlencoded
...
17
demo_mail=<foo@bar.com>
0
由于您已将字符串包装成 a ,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>
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报
0/150
提交
取消