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

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

            }

任何帮助表示赞赏。


慕丝7291255
浏览 93回答 1
1回答

眼眸繁星

您期望的正文实际上已正确发送,但可能不是您想要的方式:POST /foo HTTP/1.1...Transfer-Encoding: chunked...Content-Type: application/x-www-form-urlencoded...17demo_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>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go