首页 文章

使用请求正文发送POST请求,就像字符串一样

提问于
浏览
0

我在我的网络服务器上设置了一个页面,其中包含一个“电子邮件地址”框和一个提交按钮 . 我有它,所以当它被提交时,它会发送一个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 回答

  • 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的最终块 .

    如果您不想拥有此行为,则需要提供一个预先知道长度的缓冲区 . 这可以通过简单地删除 bytes.NewBufferString 周围的_34325来完成:

    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>
    

相关问题