我在我的网络服务器上设置了一个页面,其中包含一个“电子邮件地址”框和一个提交按钮 . 我有它,所以当它被提交时,它会发送一个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")
}
任何帮助表示赞赏 .
1 回答
您期望的身体实际上是正确发送但可能不是您想要的方式:
因为你已经将你的字符串包装成了一个
io.NopCloser
,所以它会假设前面的长度是未知的 . 因此,它将使用分块传输编码来发送从io.Reader
返回的每个块,其前缀为其长度,并且一旦所有内容都完成了长度为0的最终块 .如果您不想拥有此行为,则需要提供一个预先知道长度的缓冲区 . 这可以通过简单地删除
bytes.NewBufferString
周围的_34325来完成:有了这个请求将使用
Content-length
而不是分块传输编码,并且正文将只包含字符串: