| /* |
| # ================================================================================== |
| # Copyright (c) 2020 HCL Technologies Limited. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # ================================================================================== |
| */ |
| #include"RestClient.h" |
| namespace xapp |
| { |
| void cpprestclient::SetbaseUrl(std::string url) |
| { |
| this->baseUrl = utility::conversions::to_string_t(url); |
| this->Baseurl = url; |
| } |
| cpprestclient::cpprestclient(std::string base_url) { |
| this->baseUrl = utility::conversions::to_string_t(base_url); |
| this->Baseurl = base_url; |
| } |
| cpprestclient::cpprestclient(std::string base_url, std::function<void(web::http::http_request)>callback):listener{ utility::conversions::to_string_t(resp_url) } |
| { |
| this->baseUrl= utility::conversions::to_string_t(base_url); |
| this->Baseurl = base_url; |
| try |
| { |
| listener.support(web::http::methods::POST, [callback](web::http::http_request request) { callback(request); }); |
| ok_2_run = true; |
| /* |
| ok_2_run = true; |
| t = new std::thread*[1]; |
| t[0] = new std::thread(&cpprestclient::response_listener, this); |
| t[0]->detach(); |
| */ |
| response_listener(); |
| |
| |
| } |
| catch (std::exception const & e) |
| { |
| std::wcout << e.what() << std::endl; |
| } |
| |
| } |
| cpprestclient::cpprestclient(std::string base_url,std::string response_url, std::function<void(web::http::http_request)>callback):listener{ utility::conversions::to_string_t(response_url) }{ |
| |
| this->baseUrl= utility::conversions::to_string_t(base_url); |
| this->Baseurl = base_url; |
| try |
| { |
| listener.support(web::http::methods::POST, [callback](web::http::http_request request) { callback(request); }); |
| /* |
| ok_2_run = true; |
| t = new std::thread*[1]; |
| t[0] = new std::thread(&cpprestclient::response_listener, this); |
| t[0]->detach(); |
| */ |
| response_listener(); |
| |
| |
| |
| } |
| catch (std::exception const & e) |
| { |
| std::wcout << e.what() << std::endl; |
| } |
| |
| |
| |
| } |
| |
| /* |
| void cpprestclient::start_response_listener() { |
| try { |
| t[0] = new std::thread(&cpprestclient::response_listener, this); |
| t[0]->detach(); |
| } |
| catch (std::exception const & e) |
| { |
| std::wcout << e.what() << std::endl; |
| } |
| } |
| */ |
| std::string cpprestclient::getBaseUrl() |
| { |
| return Baseurl; |
| } |
| void cpprestclient::response_listener() { |
| try |
| { |
| this->listener.open().wait(); |
| //std::cout<<"kumar "<<"\n"; |
| //std::this_thread::sleep_for(std::chrono::seconds(20)); |
| /* |
| while (ok_2_run) { |
| //std::cout<<"sandeeep "; |
| |
| } |
| */ |
| |
| } |
| catch (std::exception const & e) |
| { |
| std::wcout << e.what() << std::endl; |
| } |
| } |
| void cpprestclient::stop_response_listener() { |
| try |
| { |
| ok_2_run = false; |
| listener.close(); |
| //delete[] t; |
| std::cout << "\nclosed1\n"; |
| } |
| catch (std::exception const & e) |
| { |
| std::wcout << e.what() << std::endl; |
| } |
| } |
| oresponse_t cpprestclient::post_subscriptions(const nlohmann::json & json, std::string path) { |
| oresponse_t res; |
| res.status_code = 0; |
| res.SubscriptionId = ""; |
| auto postJson = pplx::create_task([&]() { |
| utility::stringstream_t s; |
| s << json.dump().c_str(); |
| web::json::value sdk_json = web::json::value::parse(s); |
| web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path)); |
| auto addr = uri.to_uri().to_string(); |
| web::http::client::http_client client(addr); |
| return client.request(web::http::methods::POST, U("/"), sdk_json.serialize(), U("application/json")); |
| }) |
| .then([&](web::http::http_response response) { |
| |
| res.status_code = response.status_code(); |
| if (response.status_code() != 201) { |
| throw std::runtime_error("Returned " + std::to_string(response.status_code())); |
| } |
| ucout << response.to_string() << "\n"; |
| response.headers().set_content_type(U("application/json")); |
| return response.extract_json(); |
| }) |
| |
| .then([&](web::json::value jsonObject) { |
| res.SubscriptionId = utility::conversions::to_utf8string(jsonObject[U("SubscriptionId")].as_string()); |
| |
| //validating subscription response against its schema |
| std::string s = utility::conversions::to_utf8string(jsonObject.serialize()); |
| nlohmann::json j= nlohmann::json::parse(s); |
| xapp::model::SubscriptionResponse SResp; |
| xapp::model::from_json(j, SResp); |
| |
| //sanity check |
| nlohmann::json ans; |
| xapp::model::to_json(ans, SResp); |
| std::cout << ans.dump(4) << "\n"; |
| |
| }); |
| try { |
| postJson.wait(); |
| } |
| catch (const std::exception& e) { |
| |
| printf("Error exception:%s\n", e.what()); |
| } |
| return res; |
| |
| } |
| int cpprestclient::delete_subscriptions(std::string Id, std::string path) |
| { |
| int status_code=0; |
| auto delJson = pplx::create_task([&]() { |
| web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path)); |
| auto addr = uri.to_uri().to_string(); |
| web::http::client::http_client client(addr); |
| addr.append(utility::conversions::to_string_t(Id)); |
| //ucout << utility::string_t(U("making requests at: ")) << addr << std::endl; |
| return client.request(web::http::methods::DEL); |
| }) |
| |
| |
| .then([&](web::http::http_response response) { |
| status_code = response.status_code(); |
| if (response.status_code() != 204) { |
| throw std::runtime_error("Returned " + std::to_string(response.status_code())); |
| } |
| }); |
| |
| try { |
| delJson.wait(); |
| } |
| catch (const std::exception& e) { |
| printf("Error exception:%s\n", e.what()); |
| } |
| |
| return status_code; |
| } |
| response_t cpprestclient::get_config(std::string path) |
| { |
| response_t res; |
| res.status_code = 0; |
| res.body = utility::conversions::to_string_t(""); |
| auto postJson = pplx::create_task([&]() { |
| |
| |
| web::http::client::http_client client(this->baseUrl); |
| |
| |
| return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string()); |
| }) |
| .then([&](web::http::http_response response) { |
| |
| res.status_code = response.status_code(); |
| if (response.status_code() != 200) { |
| throw std::runtime_error("Returned " + std::to_string(response.status_code())); |
| } |
| ucout << response.to_string() << "\n"; |
| response.headers().set_content_type(U("application/json")); |
| return response.extract_json(); |
| }) |
| |
| .then([&](web::json::value jsonObject) { |
| //validating configlist against its schema |
| std::string s = utility::conversions::to_utf8string(jsonObject.serialize()); |
| res.body = nlohmann::json::parse(s); |
| std::vector<xapp::model::XAppConfig> cfg; |
| xapp::model::from_json(res.body, cfg); |
| |
| //sanity check |
| nlohmann::json ans; |
| xapp::model::to_json(ans, cfg); |
| std::cout << ans.dump(4) << "\n"; |
| }); |
| try { |
| postJson.wait(); |
| } |
| catch (const std::exception& e) { |
| printf("Error exception:%s\n", e.what()); |
| } |
| return res; |
| } |
| response_t cpprestclient::get_subscriptions(std::string path) |
| { |
| response_t res; |
| res.status_code = 0; |
| res.body = utility::conversions::to_string_t(""); |
| auto postJson = pplx::create_task([&]() { |
| |
| |
| web::http::client::http_client client(this->baseUrl); |
| |
| |
| return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string()); |
| }) |
| .then([&](web::http::http_response response) { |
| |
| res.status_code = response.status_code(); |
| if (response.status_code() != 200) { |
| throw std::runtime_error("Returned " + std::to_string(response.status_code())); |
| } |
| ucout << response.to_string() << "\n"; |
| response.headers().set_content_type(U("application/json")); |
| return response.extract_json(); |
| }) |
| |
| .then([&](web::json::value jsonObject) { |
| |
| //validating subscription list against its schema |
| std::string s = utility::conversions::to_utf8string(jsonObject.serialize()); |
| res.body = nlohmann::json::parse(s); |
| std::vector<xapp::model::SubscriptionData> subList; |
| xapp::model::from_json(res.body, subList); |
| |
| //sanity check |
| nlohmann::json ans; |
| xapp::model::to_json(ans, subList); |
| std::cout << ans.dump(4) << "\n"; |
| |
| }); |
| try { |
| postJson.wait(); |
| } |
| catch (const std::exception& e) { |
| printf("Error exception:%s\n", e.what()); |
| } |
| return res; |
| } |
| response_t cpprestclient::do_post(const nlohmann::json & json, std::string path) |
| { |
| response_t res; |
| res.status_code = 0; |
| res.body = utility::conversions::to_string_t(""); |
| auto postJson = pplx::create_task([&]() { |
| //conversion from nlhomann json to cpprestsdk json |
| utility::stringstream_t s; |
| s << json.dump().c_str(); |
| web::json::value sdk_json = web::json::value::parse(s); |
| web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path)); |
| auto addr = uri.to_uri().to_string(); |
| web::http::client::http_client client(addr); |
| return client.request(web::http::methods::POST, U("/"), sdk_json.serialize(), U("application/json")); |
| }) |
| .then([&](web::http::http_response response) { |
| |
| res.status_code = response.status_code(); |
| if (response.status_code() != 201) { |
| throw std::runtime_error("Returned " + std::to_string(response.status_code())); |
| } |
| ucout << response.to_string() << "\n"; |
| response.headers().set_content_type(U("application/json")); |
| return response.extract_json(); |
| }) |
| |
| .then([&](web::json::value jsonObject) { |
| //std::cout << "\nRecieved REST subscription response\n"; |
| //std::wcout << jsonObject.serialize().c_str() << "\n"; |
| //resp.body = jsonObject.serialize(); |
| |
| //conversion from cpprestsdk json to nlhomann json |
| std::string s = utility::conversions::to_utf8string(jsonObject.serialize()); |
| res.body = nlohmann::json::parse(s); |
| }); |
| try { |
| postJson.wait(); |
| } |
| catch (const std::exception& e) { |
| printf("Error exception:%s\n", e.what()); |
| } |
| return res; |
| } |
| response_t cpprestclient::do_del(std::string Id, std::string path) |
| { |
| response_t res; |
| res.status_code = 0; |
| res.body = utility::conversions::to_string_t(""); |
| auto delJson = pplx::create_task([&]() { |
| web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path)); |
| auto addr = uri.to_uri().to_string(); |
| web::http::client::http_client client(addr); |
| addr.append(utility::conversions::to_string_t(Id)); |
| //ucout << utility::string_t(U("making requests at: ")) << addr << std::endl; |
| return client.request(web::http::methods::DEL); |
| }) |
| |
| |
| .then([&](web::http::http_response response) { |
| res.status_code = response.status_code(); |
| if (response.status_code() != 204) { |
| throw std::runtime_error("Returned " + std::to_string(response.status_code())); |
| } |
| ucout << response.to_string() << "\n"; |
| response.headers().set_content_type(U("application/json")); |
| return response.extract_json(); |
| //std::wcout << "Deleted: " << std::boolalpha << (response.status_code() == 204) << std::endl; |
| }) |
| .then([&](web::json::value jsonObject) { |
| |
| //resp.body = jsonObject.serialize(); |
| std::string s = utility::conversions::to_utf8string(jsonObject.serialize()); |
| res.body = nlohmann::json::parse(s); |
| }); |
| |
| try { |
| delJson.wait(); |
| } |
| catch (const std::exception& e) { |
| printf("Error exception:%s\n", e.what()); |
| } |
| |
| return res; |
| |
| } |
| response_t cpprestclient::do_get(std::string path) |
| { |
| response_t res; |
| res.status_code = 0; |
| res.body = utility::conversions::to_string_t(""); |
| auto postJson = pplx::create_task([&]() { |
| |
| |
| web::http::client::http_client client(this->baseUrl); |
| |
| |
| return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string()); |
| }) |
| .then([&](web::http::http_response response) { |
| |
| res.status_code = response.status_code(); |
| if (response.status_code() != 200) { |
| throw std::runtime_error("Returned " + std::to_string(response.status_code())); |
| } |
| ucout << response.to_string() << "\n"; |
| response.headers().set_content_type(U("application/json")); |
| return response.extract_json(); |
| }) |
| |
| .then([&](web::json::value jsonObject) { |
| |
| //resp.body = jsonObject.serialize(); |
| std::string s = utility::conversions::to_utf8string(jsonObject.serialize()); |
| res.body = nlohmann::json::parse(s); |
| }); |
| try { |
| postJson.wait(); |
| } |
| catch (const std::exception& e) { |
| printf("Error exception:%s\n", e.what()); |
| } |
| return res; |
| } |
| } |
| |
| |