2012-07-12 365 views
1

我有通過https發送POST的問題。在上面的代碼片段中,第一部分(註釋)運行良好。下一部分不會:它不發送任何請求。 我需要解決什麼問題?發送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

你的問題是什麼?什麼是問題? – 2012-07-12 23:04:37

+1

你也可以嘗試'stream <<「Connection:close \ r \ n」;'因爲你提供了一個Content-Length並且你沒有重新使用這個連接 – portforwardpodcast 2014-02-25 20:44:39

回答

8

你的代碼有幾個問題。

1)您的POST行指定完整的URL,而應僅指定主機相對路徑。不要在該行中指定URL方案或主機名。這隻在連接到代理時才需要。

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

2)HTTP標頭是由兩個連續的CRLF對終止,但是您的代碼僅發送Content-Length報頭和主體數據之間的一個CRLF對,和自己的身體的數據只與一個CRLF對結束(你不需要),所以當HTTP請求完成發送時,沒有任何東西可以告訴服務器。

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

3)您Content-Length頭的值是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;