2014-03-18 36 views
2

Boost docs,您可以通過iostream的發送GET很容易:如何用boost :: asio :: ip :: tcp :: iostream發送POST?

ip::tcp::iostream stream; 
stream.expires_from_now(boost::posix_time::seconds(60)); 
stream.connect("www.boost.org", "http"); 
stream << "GET /LICENSE_1_0.txt HTTP/1.0\r\n"; 
stream << "Host: www.boost.org\r\n"; 
stream << "Accept: */*\r\n"; 
stream << "Connection: close\r\n\r\n"; 
stream.flush(); 
std::cout << stream.rdbuf(); 

當我修改上面的連接到我的IIS服務器,它工作正常。當我嘗試向我的服務器發送POST時,問題就出現了。然後,我收到錯誤消息「HTTP Error 400.請求動詞無效。」

各種在線討論似乎是問題與標題中的分隔符字符,但刪除所有問號,什麼都不固定。

有什麼,我在這裏失蹤? This forum discussion使它看起來像使用iostream發佈應該是可行的。谷歌並沒有太大的用處,因爲郵報在線是一個超載的詞。

編輯 - 這是我的POST的一個例子。使用GET時,服務器會將其提取出來,處理程序會抱怨它需要POST(因爲它應該)。

boost::asio::ip::tcp::iostream stream; 

stream.connect("myurl.com", "http"); 
stream << "POST /.api/api.svc/objects/723aa707-4978-4062-bcc6-67b05783c4ec/comments/add\r\n"; 
stream << "Host: myurl.com\r\n"; 
stream << "Accept: */*\r\n"; 
stream << "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n"; 
stream << "Content-Length: 51\r\n"; 
stream << "Connection: close\r\n\r\n"; 

stream << "message=%3Cp%3EHello%3C%2Fp%3E"; 
stream.flush(); 
std::cout << stream.rdbuf(); 
+0

你的'POST'代碼是什麼樣的? – ecatmur

+0

我用一個例子編輯了這個問題。 –

+4

我注意到的一件事是,在POST行末尾不包含請求的HTTP版本。 – Omaha

回答

1

如@Omaha發現,POST請求無效。 POST行應該是這樣的:

stream << "POST /.api/api.svc/objects/723aa707-4978-4062-bcc6-67b05783c4ec/comments/add HTTP/1.0\r\n" 

是一個有效的HTTP請求。請參閱HTTP/1.1: Request

相關問題