20
Casablanca でHTTP H.26/09/20 Egtra For Boost.勉強会 #16

Casablanca

  • Upload
    egtra

  • View
    681

  • Download
    4

Embed Size (px)

DESCRIPTION

Boost.勉強会#16 大阪で発表したときのものです。

Citation preview

Page 1: Casablanca

CasablancaでHTTP

H.26/09/20

EgtraFor Boost.勉強会 #16

Page 2: Casablanca

自分

• Egtra– Twitter: @egtra

– http://dev.activebasic.com/egtra/

• 仕事: 主にVisual C++ 2005 (Windows)

– 最近C++ (Linux)も少し

Page 3: Casablanca

動機:私は探していた

• HTTPライブラリ(クライアント)

–主にAPIサーバー相手の通信

• クロスプラットフォーム

–WindowsとLinuxほかUnix系

Page 4: Casablanca

C++ REST SDK

• クライアント・サーバ– HTTPS対応

• JSON, Oauth, WebScoket

• Win/Mac/Linuxなど

• C++11必須

• MS発OSSライブラリ

• https://casablanca.codeprex.com/

※ グレーは今回私が使っていないものです。

Page 5: Casablanca

プラットフォーム

• Windows

–Desktop/Store/Phone

• Linux, FreeBSD

–Android: 対応中(?)

• Mac OS X, iOS

Page 6: Casablanca

こんな感じ (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>

Page 7: Casablanca

こんな感じ (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();

Page 8: Casablanca

こんな感じ(まとめ)

• http_clientを作る

• requestに↑ を渡す

• http_responseを受け取る

• extract_*()で中身を得る

Page 9: Casablanca

pplx::task

• VC++のppl::taskの移植版

• ほぼstd::future

–thenメンバ関数がある!

–協調的キャンセル機構など

Page 10: Casablanca

thenによるチェイン (1)

client.request(req)

.then([](const auto& res) {

return res.extract_vector();

}).then([](const auto& vec) {

return vecをいい感じに解析;

}).then([](const std::string& result) {

……

Page 11: Casablanca

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をいい感じに解析;

});

}

Page 12: Casablanca

ヘッダー

• 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)(書き込み)

Page 13: Casablanca

リクエスト・ボディー

• req.set_body(……)– 文字列 (std::string or string_t)

– 文字列, Content-Type文字列

– json::value

– std::vector<unsigned char>

– concurrency::stream::istream

Page 14: Casablanca

ステータスコード

• res.status_code() -> status_code

– typedef unsigned short status_code;

– 定数status_codes::OKほか

• res.reason_phrase()

Page 15: Casablanca

レスポンス・ボディー

• res.extract_string()-> pplx::task<文字列>

• res.extract_json() -> pplx::<json::value>

• res.extract_vector() ->pplx::task<std::vector<unsigned char>>

• body() -> concurrency::streams::istream

Page 16: Casablanca

文字列

• Windows: UTF-16 (wchar_t)

• その他: UTF-8 (char)

• 共通化– char_t, string_t, stringstream_t

– U("リテラル")

– ucout, ucin, ucerr

Page 17: Casablanca

足回り

• Windows:

–WinHTTP.dll, WinHTTP.sys

–IXmlHttpRequest2

• その他: Boost.Asio– SSL: boost::asio::ssl (OpenSSL)

Page 18: Casablanca

インストール

• Windows:

–Visual Studio内nuget

Page 19: Casablanca

インストール (Ubuntu)

apt-get install openssl-dev cmake

cd casablanca/Release

mkdir build.release

cd build.release

cmake .. BOOST_ROOT=……

# aptでBoostを入れたなら、BOOST_ROOT不要

Page 20: Casablanca

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.