CppRestAPIの通信
Share
Routingではcpprestsdkによってhttp_listenerの登録を行いました。
続いてクライアントとサーバーの通信について説明します。
クライアントからJsonデータを送信しサーバーのレスポンスを取得するにはpplx::task<ResponseData>の戻り値の関数を定義します。
pplx::task<ResponseData>はpptx::create_taskでResponseData型を返すラムダ式等で作成します。
pplx::task<ResponseData> async(Arg arg) {
return pptx::create_task([capture]
::web::http::client::http_client client(url);
//リクエストを送信します。client.requestを引数にしてthenメソッドに登録されたラムダ式を呼び出します。
return client.request(::web::http::methods::<GET|PUT|POST|DEL>);
}).then([capture](::web::http::http_response response) {
//PUT、POST、DELリクエストの場合はリクエストステータスを受け取って終了します。ResponseDataはvoidになります。
return;
//GETメソッドの場合はbodyをcpprestapiのjsonに展開します。
return response.extract_json;
}).then([capture](::web::json::value json) {
ResponseData response_data;
response_data = response_json_conver_to_poroject_type(json);
return data;
});
}
CppRestAPIでは
cpprestsdkではサーバークライアント間でデータをやりとりするときに::web::json::value形式に変換して行います。サーバーとクライアントのC++の文字コードが違っても::web::json::valueのシリアライズを通して通信しています。
上記のasync関数をクライアントで呼び出す場合、同期、非同期で通信を選択できます。
async(arg).then().await()で処理を待ちます。
async(arg).then().then([this](pptx::task<void> previous_task) {previous_task.wait();})で非同期通信を行います。
サーバー側では::web::json::value response_jsonを返します。
void get(::web::http::http_request req) {
::web::json::value response_json;
req.reply(::web::http::status_codes::OK, response_json);
return;
}