c++ - 发送 POST 请求

标签 c++ https httprequest boost-asio

我在通过 https 发送 POST 时遇到问题。在上面的代码片段中,第一部分(注释)运行良好。下一部分没有:它不发送任何请求。 我需要什么来修复它?

P.s 问题可能是因为我的 Lib boost 不支持 HTTPS。

    #include "stdafx.h"
    #include <iostream>
    #include <boost/asio.hpp>
    #include <conio.h>
    #include <stdio.h>
    #include <fstream>

    char buffer [9999999];

    int main()
    {
        boost::asio::ip::tcp::iostream stream;
        stream.expires_from_now(boost::posix_time::seconds(60));
        stream.connect("www.mail.ru","http");
        //stream << "GET / HTTP/1.1\r\n";
        //stream << "Host mail.ru\r\n";
        //stream << "User-Agent   Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11\r\n";
        //stream << "Accept   text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" ;
        //stream << "Accept-Encoding  gzip,deflate,sdch\r\n";
        //stream << "Accept-Language  en-US,en;q=0.8\r\n";
        //stream <<"Accept-Charset    ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n";
        //stream << "Cookie   \r\n\r\n";

    stream << "POST https://auth.mail.ru/cgi-bin/auth HTTP/1.1\r\n";
    stream << "Host: auth.mail.ru\r\n";
    stream << "User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1\r\n";
    stream << "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
    stream << "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
    stream << "Accept-Encoding: gzip, deflate\r\n";
    stream << "Connection: keep-alive\r\n";
    stream << "Referer: http://mail.ru/\r\n";
    stream << "X-MailRuSputnik: generic\r\n";
    stream << "Content-Type: application/x-www-form-urlencoded\r\n";
    stream << "Content-Length: 59\r\n";

    stream << "Domain=mail.ru&Login=(login)&Password=(password)&level=0\r\n";

        stream.flush();
        using namespace std ;
     // cout << stream.rdbuf();
        ofstream f("output.txt" /*| ios::bin*/);
        f << stream.rdbuf();
        f.close();
        system("pause");
        return 0 ;
    }

最佳答案

您的代码有几个问题。

1) 您的 POST 行指定了完整的 URL,而它应该只指定主机相对路径。不要在该行中指定 URL 方案或主机名。只有在连接到代理时才需要。

stream << "POST /cgi-bin/auth HTTP/1.1\r\n";

2) HTTP header 由两个连续的 CRLF 对终止,但您的代码仅在 Content-Length header 和正文数据之间发送一对 CRLF,而您的正文数据仅以一个结束CRLF 对(您不需要),因此当 HTTP 请求发送完毕时无需告知服务器。

stream << "Content-Length: 59\r\n"; 
stream << "\r\n"; // <-- add this

3) 您的 Content-Length header 的值为 59,但您显示的正文数据的长度却是 58。这将导致服务器尝试读取比您实际发送的字节更多的字节,从而阻止发送响应(除非服务器实现接收超时,然后可以发回错误响应)。我建议你将正文​​数据放入 std::string 中,然后使用其 length() 方法填写正确的 Content-Length动态取值而不是硬编码。

std::string content = "Domain=mail.ru&Login=(login)&Password=(password)&level=0";
...
stream << "Content-Length: " << content.length() << "\r\n";
stream << "\r\n";

stream << content;

关于c++ - 发送 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11461962/

相关文章:

java - 如何使用 java.net.URLConnection 来触发和处理 HTTP 请求

android - @Part in multipart 发送双引号中的字符串参数

c++ - 类型转换为抽象类?

带有初始化列表的 C++ 委托(delegate)构造函数。发生了哪些初始化?

c++ - 设置精度无法正常工作

java - Java 6 中的密码证书命中不在 Java 7 中运行

asp.net-web-api - 我怎样才能告诉Swashbuckle人体必需的成分?

c++ - SendMessage 不适用于 Word 应用程序

android - 接受带有自签名证书的 HTTPS 连接

ssl - 如何在本地主机的 Chrome 和 Firefox 上关闭 SSL 检查