boost::asioでhttps-post

似たようなサンプルコードは沢山ある(公式にも)が、GETばかりなので。

//--------------------------------------------------------------------------------
int Connect(std::string *Body,const std::string &host,const std::string &path,const std::string &query)
{
	try {
		boost::asio::io_service io_service;

		boost::asio::ssl::context context( io_service, boost::asio::ssl::context::sslv3_client );
		boost::asio::ssl::stream< boost::asio::ip::tcp::socket > ssl_stream( io_service, context );
	
		//resolveを使ってサイトが存在するのか確認、そして接続
		ssl_stream.lowest_layer().connect(
			*boost::asio::ip::tcp::resolver( io_service ).resolve( boost::asio::ip::tcp::resolver::query( host, "https" ) )
		);
		ssl_stream.handshake( boost::asio::ssl::stream_base::client );

		//requestを作成する-------------------------------
		boost::asio::streambuf request;
		std::ostream request_stream( & request );

		request_stream << "POST " << path << " HTTP/1.0\r\n";
		request_stream << "Host: " << host << "\r\n";
		request_stream << "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
		request_stream << "Content-Length: " << query.length() << "\r\n";
		request_stream << "Connection: Close\r\n";
		request_stream << "\r\n";
		request_stream << query << "\r\n";
		//------------------------------------------------
		
		//リクエストの送信
		boost::asio::write( ssl_stream, request );

		//リクエストの受信と表示
		boost::asio::streambuf response;
		boost::asio::read_until(ssl_stream, response, "\r\n");
		
		std::istream response_stream(&response);
		std::string		http_version;
		response_stream >>	http_version;
		unsigned int		status_code;
		response_stream >>	status_code;

		boost::system::error_code error;
		while( boost::asio::read( ssl_stream, response, boost::asio::transfer_at_least(1), error ) )
			*Body = boost::asio::buffer_cast<const char*>(response.data());
		
		std::size_t pos = Body->find("\r\n\r\n");
		if (pos != std::string::npos) {
			*Body = Body->substr(pos + 4);
		}

		return status_code;
	}
	catch (...) {
		return -1;
	}
}

host,path,queryを入れるとbodyに結果を返してくれる単純な関数。戻り値はレスポンスコード(何事もなく成功なら200)。
おまじないが沢山あるけどググればその理由が出てくるハズ。
ちなみにこのままでは同期通信しかできないので、外で別スレッド化してぶん回す(ハトクラPCはそれ)か、公式を見ながら非同期用の関数を使うのが良い。