use*_*777 1 c++ https httprequest boost-asio
我通过https发送POST时遇到问题.在上面的代码片段中,第一部分(已注释)运行良好.下一部分不会:它不发送任何请求.我需要解决什么问题?
Ps也许问题出在我的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 ;
}
Run Code Online (Sandbox Code Playgroud)
您的代码有几个问题.
1)POST当您应该仅指定主机相对路径时,您的行正在指定完整的URL.不要在该行中指定URL方案或主机名.只有在连接到代理时才需要这样做.
stream << "POST /cgi-bin/auth HTTP/1.1\r\n";
Run Code Online (Sandbox Code Playgroud)
2)HTTP标头是由两个连续的CRLF对终止,但是您的代码只在发送之间的一个CRLF对Content-Length报头和所述主体数据,以及自己的身体的数据只与一个CRLF对结束(它不需要),所以有在HTTP请求完成发送时没有告诉服务器.
stream << "Content-Length: 59\r\n";
stream << "\r\n"; // <-- add this
Run Code Online (Sandbox Code Playgroud)
3)Content-Length标题的值是59,但您显示的正文数据的长度是58.这将导致服务器尝试读取比实际发送更多的字节,从而阻止发送响应(除非服务器实现接收超时,然后可以发回错误响应).我建议你将body数据放入a 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5640 次 |
| 最近记录: |