Casablanca でHTTP 
H.26/09/20 
Egtra 
For Boost.勉強会#16
自分 
•Egtra 
–Twitter: @egtra 
–http://dev.activebasic.com/egtra/ 
•仕事: 主にVisual C++ 2005 (Windows) 
–最近C++ (Linux)も少し
動機:私は探していた 
•HTTPライブラリ(クライアント) 
–主にAPIサーバー相手の通信 
•クロスプラットフォーム 
–WindowsとLinuxほかUnix系
C++ REST SDK 
•クライアント・サーバ 
–HTTPS対応 
•JSON, Oauth, WebScoket 
•Win/Mac/Linuxなど 
•C++11必須 
•MS発OSSライブラリ 
•https://casablanca.codeprex.com/ 
※ グレーは今回私が使っていないものです。
プラットフォーム 
•Windows 
–Desktop/Store/Phone 
•Linux, FreeBSD 
–Android: 対応中(?) 
•Mac OS X, iOS
こんな感じ(1⁄2) 
http_clientclient(U("http://example.com/")); 
http_requestreq(methods::POST); 
req.set_request_uri(U("my_api.txt")); 
req.set_body(……); 
autoresTask= client.request(req); 
// resTaskはpplx::task<http_response>
こんな感じ(2⁄2) 
autobodyTask= 
resTask.then([](consthttp_response& res) { 
// res.status_code(); 
// res.headers().content_type(); 
returnres.extract_body(); 
}; 
std::vector<unsigned char> body = 
bodyTask.get();
こんな感じ(まとめ) 
•http_clientを作る 
•requestに↑ を渡す 
•http_responseを受け取る 
•extract_*()で中身を得る
pplx::task 
•VC++のppl::taskの移植版 
•ほぼstd::future 
–thenメンバ関数がある! 
–協調的キャンセル機構など
thenによるチェイン(1) 
client.request(req) 
.then([](constauto& res) { 
returnres.extract_vector(); 
}).then([](constauto& vec) { 
returnvecをいい感じに解析; 
}).then([](conststd::string& result) { 
……
thenによるチェイン(2) 
pplx::task<std::string> call_my_api() { 
returnclient.request(req) 
.then([](constauto& res) { 
returnres.extract_vector(); 
}).then([](constauto& vec) { 
returnvecをいい感じに解析; 
}); 
}
ヘッダー 
•req.headers().… orres.headers().… 
–add(name, value), remove(name) 
–has(name), [], find(name) 
–begin(), end(), size(), empty() 
–content_type(), content_length(), 
–date(), cache_control()(読み取り) 
•set_…(value)(書き込み)
リクエスト・ボディー 
•req.set_body(……) 
–文字列(std::string orstring_t) 
–文字列, Content-Type文字列 
–json::value 
–std::vector<unsigned char> 
–concurrency::stream::istream
ステータスコード 
•res.status_code() -> status_code 
–typedefunsigned shortstatus_code; 
–定数status_codes::OKほか 
•res.reason_phrase()
レスポンス・ボディー 
•res.extract_string()-> pplx::task<文字列> 
•res.extract_json() -> pplx::<json::value> 
•res.extract_vector() -> pplx::task<std::vector<unsigned char>> 
•body() -> concurrency::streams::istream
文字列 
•Windows: UTF-16(wchar_t) 
•その他: UTF-8(char) 
•共通化 
–char_t, string_t, stringstream_t 
–U("リテラル") 
–ucout, ucin, ucerr
足回り 
•Windows: 
–WinHTTP.dll, WinHTTP.sys 
–IXmlHttpRequest2 
•その他: Boost.Asio 
–SSL: boost::asio::ssl(OpenSSL)
インストール 
•Windows: 
–Visual Studio内nuget
インストール(Ubuntu) 
apt-get install openssl-devcmake 
cdcasablanca/Release 
mkdirbuild.release 
cdbuild.release 
cmake.. BOOST_ROOT=…… 
# aptでBoostを入れたなら、BOOST_ROOT不要
This work is licensed under a Creative Commons Attribution- ShareAlike4.0 International License.

Casablanca