備忘録

備忘録

C++でHTTP(S)でGET/POSTする(cpprestsdk の使い方)

Ⅰ. はじめに

.NET系 であれば WebClient や HttpClient が標準である為、
追加のライブラリ無しでHTTPをモダンかつ簡単に扱うことができます。

しかし、C++にはそのような物が標準ではありません。
ライブラリを探した結果、Microsoft社が作成しているC++ RESET SDK(cpprestsdk)にたどり着きました。

Ⅱ. なぜ「C++ RESET SDK(cpprestsdk)」を選んだのか

Ⅲ. インストール方法

※NuGetで配布されている物はダイナミックリンクライブラリのみ。
スタティックリンクライブラリが欲しい人はこちら

Install-Package cpprestsdk
sudo apt-get install libcpprest-dev
brew install cpprestsdk

その他は公式を参照して下さい。
https://github.com/Microsoft/cpprestsdk/wiki/Getting-Started-Tutorial#getting-the-c-rest-sdk

Ⅳ. サンプルコード

GET
#include <Windows.h>
#include <iostream>
#include <cpprest/http_client.h>

using namespace web;
using namespace web::http;
using namespace web::http::client;

pplx::task<void> Get()
{
  return pplx::create_task([]
  {
    http_client client(L"https://jsonplaceholder.typicode.com/posts/1");
    return client.request(methods::GET);
  }).then([](http_response response)
  {
    if (response.status_code() == status_codes::OK)
    {
      // レスポンスを文字列として取得後、標準出力する
      // auto body = response.extract_string();
      // std::wcout << body.get().c_str() << std::endl;

      // レスポンスをJSONとして解析する
      return response.extract_json();
    }
  }).then([](json::value json)
  {
    // タイトルだけ取得する
    std::wcout << json[L"title"].as_string() << std::endl;
  });
}

int main()
{
  // コマンドプロンプトの文字コードをUTF-8に設定する
  SetConsoleOutputCP(CP_UTF8);

  try
  {
    Get().wait();
  }
  catch (const std::exception &e)
  {
    std::cout << "Error " << e.what() << std::endl;
  }

  return 0;
}
実行結果

f:id:kagasu:20171007190436p:plain

POST
#include <Windows.h>
#include <iostream>
#include <cpprest/http_client.h>

using namespace web;
using namespace web::http;
using namespace web::http::client;

pplx::task<int> Post()
{
  return pplx::create_task([]
  {
    json::value postData;
    postData[L"user_info"][L"name"] = json::value::string(L"user001");
    postData[L"user_info"][L"age"] = json::value::number(20);

    http_client client(L"http://localhost/api");
    return client.request(methods::POST, L"", postData.serialize(), L"application/json");
  }).then([](http_response response)
  {
    if (response.status_code() == status_codes::OK)
    {
      //auto body = response.extract_string();
      //std::wcout << body.get().c_str() << std::endl;
      //std::cout << response.extract_json() << std::endl;
      return response.extract_json();
    }
  }).then([](json::value json)
  {
    // リザルトコードを返す
    return json[L"result"].as_integer();
  });
}

int main()
{
  // コマンドプロンプトの文字コードをUTF-8に設定する
  SetConsoleOutputCP(CP_UTF8);

  try
  {
    auto result = Post().wait();
    std::cout << "Result = " << result << std::endl;
  }
  catch (const std::exception &e)
  {
    std::cout << "Error " << e.what() << std::endl;
  }

  return 0;
}
実行結果

f:id:kagasu:20171007190519p:plain