Go 以请求正文作为字符串发送POST请求

Go 以请求正文作为字符串发送POST请求,go,Go,我在我的Web服务器上有一个页面设置,带有一个“电子邮件地址”框和一个提交按钮。我有它,所以当它被提交时,它会发送一个post请求来检查它是否存在于我的数据库中。我一直在使用Go尝试发送此帖子请求。但是,我需要按以下方式发送请求正文: demo_mail=<email> demo\u邮件= 我在网上没有发现任何远程有用的东西,只是问如何用JSON而不是字符串发送数据的帖子。我目前有以下代码运行,但无法发送带有上述POST数据的POST请求 req, err := http.New

我在我的Web服务器上有一个页面设置,带有一个“电子邮件地址”框和一个提交按钮。我有它,所以当它被提交时,它会发送一个post请求来检查它是否存在于我的数据库中。我一直在使用Go尝试发送此帖子请求。但是,我需要按以下方式发送请求正文:

demo_mail=<email>
demo\u邮件=
我在网上没有发现任何远程有用的东西,只是问如何用JSON而不是字符串发送数据的帖子。我目前有以下代码运行,但无法发送带有上述POST数据的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")
            }
req,err:=http.NewRequest(“POST”,ioutil.nocloser(bytes.NewBufferString(“demo_mail=“+email)))
req.Header.Set(“内容类型”、“应用程序/x-www-form-urlencoded”)
req.Header.Set(“接受”,“文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,图像/webp,图像/apng,*/*;q=0.8”)
请求头.Set(“用户代理”、“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/71.0.3578.80 Safari/537.36”)
resp,err:=client.Do(请求)
如果出错!=零{
颜色。红色(“错误”)
}
延迟响应主体关闭()
正文,Util:=ioutil.ReadAll(分别为正文)
if strings.Contains(字符串(正文),“Success”){
fmt.Println(“存在电子邮件”)
}否则{
fmt.Println(“失败”)
}

感谢您的帮助。

您期望的正文实际上已正确发送,但可能不是您想要的方式:

POST /foo HTTP/1.1
...
Transfer-Encoding: chunked
...
Content-Type: application/x-www-form-urlencoded
...

17
demo_mail=<foo@bar.com>
0
这样,请求将使用
内容长度
而不是分块传输编码,并且正文将仅包含以下字符串:

POST /foo HTTP/1.1
...
Content-Length: 23
...
Content-Type: application/x-www-form-urlencoded
...

demo_mail=<foo@bar.com>
POST/foo HTTP/1.1
...
内容长度:23
...
内容类型:application/x-www-form-urlencoded
...
演示邮件=

您期望的正文实际上是正确发送的,但可能不是以您想要的方式发送的:

POST /foo HTTP/1.1
...
Transfer-Encoding: chunked
...
Content-Type: application/x-www-form-urlencoded
...

17
demo_mail=<foo@bar.com>
0
这样,请求将使用
内容长度
而不是分块传输编码,并且正文将仅包含以下字符串:

POST /foo HTTP/1.1
...
Content-Length: 23
...
Content-Type: application/x-www-form-urlencoded
...

demo_mail=<foo@bar.com>
POST/foo HTTP/1.1
...
内容长度:23
...
内容类型:application/x-www-form-urlencoded
...
演示邮件=

非常感谢您的帮助:)不过,我已经尝试了通过“邮递员”为chrome发布的帖子,效果绝对不错,但出于某种奇怪的原因,它不想通过golang发布。我还尝试使用Postman提供的代码,但它总是抛出“Redirect 200”,我真的很想知道为什么“…不想工作…”-这并不是调试问题的足够信息。除此之外,这看起来是一个新问题。我建议将工作版本和非工作版本发送和接收的内容进行比较,例如,使用数据包捕获。我不确定您对
ioutil.nocloser
的说法是否正确:请参阅
net/http.Request.Write的手册。摆脱分块编码的正确方法(如果确实需要,我承认,对于一个显然是新手的程序员来说,这是有问题的)是简单地将所创建的
http.Request
值的
ContentType
字段设置为要发送的正文的总长度。在OP的情况下,它应该相当于只调用由
字节创建的缓冲区上的
Len()
。NewBufferString
@kostix:
go doc http。NewRequest
声明如果主体类型为
字节。buffer
(以及更多)它将自动设置
内容长度
,对于大多数其他类型的正文,它将改为将长度设置为-1。最后一个将导致使用
Transfer Encoding:chunked
,如
http.Request.Write
中所述。非常感谢您的帮助:)然而,我已经通过chrome的“Postman”尝试了这篇文章,它工作得非常好,但出于某种奇怪的原因,它不想通过golang工作。我还尝试使用Postman提供的代码,但它总是抛出“Redirect 200”,我真的很想知道为什么“…不想工作…”-这并不是调试问题的足够信息。除此之外,这看起来是一个新问题。我建议将工作版本和非工作版本发送和接收的内容进行比较,例如,使用数据包捕获。我不确定您对
ioutil.nocloser
的说法是否正确:请参阅
net/http.Request.Write的手册。摆脱分块编码的正确方法(如果确实需要,我承认,对于一个显然是新手的程序员来说,这是有问题的)是简单地将所创建的
http.Request
值的
ContentType
字段设置为要发送的正文的总长度。在OP的情况下,它应该相当于只调用由
字节创建的缓冲区上的
Len()
。NewBufferString
@kostix:
go doc http。NewRequest
声明如果主体类型为
字节。buffer
(以及更多)它将自动设置
内容长度
,对于大多数其他类型的正文,它将改为将长度设置为-1。最后一个将导致使用
传输编码:chunked
,如
http.Request.Write
中所述。