Upload
egtra
View
681
Download
4
Embed Size (px)
DESCRIPTION
Boost.勉強会#16 大阪で発表したときのものです。
Citation preview
CasablancaでHTTP
H.26/09/20
EgtraFor 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_client client(U("http://example.com/"));
http_request req(methods::POST);
req.set_request_uri(U("my_api.txt"));
req.set_body(……);
auto resTask = client.request(req);
// resTaskはpplx::task<http_response>
こんな感じ (2⁄2)
auto bodyTask =
resTask.then([](const http_response& res) {
// res.status_code();
// res.headers().content_type();
return res.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([](const auto& res) {
return res.extract_vector();
}).then([](const auto& vec) {
return vecをいい感じに解析;
}).then([](const std::string& result) {
……
thenによるチェイン (2)
pplx::task<std::string> call_my_api() {
return client.request(req)
.then([](const auto& res) {
return res.extract_vector();
}).then([](const auto& vec) {
return vecをいい感じに解析;
});
}
ヘッダー
• req.headers().… or res.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 or string_t)
– 文字列, Content-Type文字列
– json::value
– std::vector<unsigned char>
– concurrency::stream::istream
ステータスコード
• res.status_code() -> status_code
– typedef unsigned short status_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-dev cmake
cd casablanca/Release
mkdir build.release
cd build.release
cmake .. BOOST_ROOT=……
# aptでBoostを入れたなら、BOOST_ROOT不要
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.