以字符串形式发送带有请求正文的POST请求

时间:2018-12-09 18:11:18

标签: go

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

答案 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>