为了账号安全,请及时绑定邮箱和手机立即绑定

发送带有请求正文的 POST 请求,就像字符串一样

发送带有请求正文的 POST 请求,就像字符串一样

Go
慕丝7291255 2023-05-15 14:59:01
我在我的网络服务器上设置了一个页面,其中包含一个“电子邮件地址”框和一个提交按钮。我有它,所以当它被提交时,它会发送一个发布请求来检查它是否存在于我的数据库中。我一直在使用 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>


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信