// RESTtest.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//
#include <Windows.h>
#include <tchar.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([]
{
// proxyあり
// auto config = http_client_config();
// config.set_proxy(web_proxy(utility::conversions::to_string_t("http://127.0.0.1:8080")));
// http_client client(L"https://jsonplaceholder.typicode.com/posts/1", config);
http_client client(L"http://192.168.14.107/api/system/status");
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"sys_name"].as_string() << std::endl;
});
}
pplx::task<int> Post()
{
return pplx::create_task([]
{
json::value postData;
auto sex = utility::conversions::to_string_t("man");
postData[L"user_info"][L"name"] = json::value::string(L"user001");
postData[L"user_info"][L"sex"] = json::value::string(sex);
postData[L"user_info"][L"age"] = json::value::number(20);
// proxyあり
// auto config = http_client_config();
// config.set_proxy(web_proxy(utility::conversions::to_string_t("http://127.0.0.1:8080")));
// http_client client(L"http://localhost/api", config);
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();
});
}
http_response POST_request(const TCHAR* baseURL, json::value data = json::value::Null) {
http_client httpClient(baseURL);
http_response httpResponse = httpClient.request(methods::POST, L"",
data == json::value::Null ? _T("") : data.serialize(), L"application/json").get();
return httpResponse;
}
http_response GET_request(const TCHAR* baseURL) {
http_client httpClient(baseURL);
http_response httpResponse = httpClient.request(methods::GET, L"", L"", L"application/json").get();
return httpResponse;
}
std::wstring WaitForStatus(const TCHAR* baseURL, std::wstring key, std::vector<std::wstring> values) {
int count = 0;
bool running = true;
int maxTries = 20;
json::value json;
std::wcout << baseURL << std::endl;
while (running) {
auto response = GET_request(baseURL);
json = response.extract_json().get();
std::wcout << _T("Status: ") << json[key].as_string() << std::endl;
if (count >= maxTries) running = false;
else {
for (int i = 0; i < values.size(); i++) {
if (json[key].as_string().compare(values[i]) == 0) {
running = false;
}
}
}
if (!running) break;
Sleep(1000);
count++;
}
return json[key].as_string();
}
int main()
{
// コマンドプロンプトの文字コードをUTF-8に設定する
SetConsoleOutputCP(CP_UTF8);
try
{
json::value json = POST_request(_T("http://192.168.14.107/api/projects")).extract_json().get();
auto prId = json[_T("pr_id")].as_string();
std::wcout << "prId=" << prId << std::endl;
json::value postData;
postData[L"pa_project"] = json::value::string(prId);
json = POST_request(_T("http://192.168.14.107/api/participants"), postData).extract_json().get();
auto paId = json[_T("pa_id")].as_string();
std::wcout << "paId=" << paId << std::endl;
json::value postData2;
postData2[L"ca_project"] = json::value::string(prId);
postData2[L"ca_type"] = json::value::string(L"default");
postData2[L"ca_participant"] = json::value::string(paId);
json = POST_request(_T("http://192.168.14.107/api/calibrations"), postData2).extract_json().get();
auto caId = json[_T("ca_id")].as_string();
std::wcout << "caId=" << caId << std::endl;
std::wstring url = _T("http://192.168.14.107/api/calibrations/") + caId + _T("/start");
json = POST_request(url.c_str()).extract_json().get();
url = _T("http://192.168.14.107/api/calibrations/") + caId + _T("/status");
std::vector<std::wstring> values;
values.push_back(_T("failed"));
values.push_back(_T("calibrated"));
std::wstring status = WaitForStatus(url.c_str(), _T("ca_state"), values);
if (status == _T("failed")) {
std::wcout << _T("Calibration failed.") << std::endl;
} else {
std::wcout << _T("Calibration successful.") << std::endl;
}
}
catch (const std::exception & e)
{
std::cout << "Error " << e.what() << std::endl;
}
}