Newer
Older
PrismSoftware / RESTtest / RESTtest.cpp
// 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;

//#define SERVER _T("http://192.168.14.107")
#define SERVER _T("http://192.168.71.50")

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(SERVER _T("/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(SERVER _T("/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(SERVER _T("/api/calibrations"), postData2).extract_json().get();
		auto caId = json[_T("ca_id")].as_string();
		std::wcout << "caId=" << caId << std::endl;

		std::wstring url = SERVER _T("/api/calibrations/") + caId + _T("/start");
		json = POST_request(url.c_str()).extract_json().get();

		url = SERVER _T("/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;
		}
		getchar();
	}
	catch (const std::exception & e)
	{
		std::cout << "Error " << e.what() << std::endl;
	}
}