CppRestAPIの通信

Admin私のストア

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ではresponse_json_conver_to_poroject_type関数にFormat::Recordコンストラクタを使用します。Format::Recordコンストラクタにtupleやjsonを指定することでデータエントリーを意識せずにプロジェクトで統一されたフォーマットで扱います。サーバークライアント間では::web::json::value record.json、データベース間ではtuple record.recordをインターフェースとして使用します。

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;

}

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。