从cpprest sdk pplx任务cpp捕获json响应值和http状态到本地变量

时间:2018-09-06 22:19:41

标签: cpprest-sdk

我想在cpp中编写一个通用函数,该函数使用cpprestsdk获取JSON数据并复制http状态响应代码和JSON数据。调用方法将使用json_resp和http_status代码。稍后,我希望通过传递URL并使用它从不同的Web服务获取数据来进一步使此函数更通用。请让我知道我该怎么做。

pplx::task<void> handleWebServerRequest( web::json::value json_resp, int *http_status)
{
..
http_client client(L"http://weburl.com:8000/getjsondata");

return client.request(methods::GET).then([](http_response response) -> pplx::task<json::value> {
// Store the http status code to be returned to calling function
*http_status = response.status_code();
..
if(response.status_code() == status_codes::OK) {
   return response.extract_json();
}

return pplx::task_from_result(json::value()); }).then([](pplx::task<json::value> previousTask) {
   try {
        // capture json response to json_resp
        json_resp = previousTask.get();
    }
    catch( const http_exception& e) {
         // print error
    }
});
}

1 个答案:

答案 0 :(得分:0)

在我的研究中,我发现使用cpprest api消耗PHP Web服务和WCF Web服务之间的唯一区别是功能参数。使用PHP Web服务时,可以将function参数设置为空字符串。与使用WCF服务时一样,您需要传递一个函数参数-因为在WCF服务中用于接收请求和发出响应的协议非常不同,但是发送和接收响应的过程是异步的,因此始终存在至少涉及三个模块,功能或任务。一个提出要求。另一个等待并接收响应,另一个解析由接收响应的函数异步调用的数据。我想您可以将所有三个任务放到一个函数中,并使用go语句执行每个任务,也许使用一些内联汇编来捕获响应,并使用指针代替参数-但是无论如何,它仍然是三个任务。另外两个在线程中运行,并且无权访问应用程序数据,但是最后一个解析数据的函数(json对象)被异步调用,您可以将其设为泛型。我不知道您要使用哪种Web服务,但是我在github-Example of Casablanca (cpprestsdk 2.9.1) consuming a PHP web serviceExample of Casablanca (cpprestsdk 2.9.1) consuming a WCF (.net) web service上发布了两个示例。我相信这应该使您有个良好的开端。为了捕获json值,您可以将json值转换为std字符串(如下所示),然后可以通过将hashmap指针参数添加到所有三个函数并将引用传递给本地hashmap变量,将它们分别存储在本地hashmap中。您可以从哪个函数调用它们,将它们转换为所需的任何数据类型。

 void get_field_map_json(json::value & jvalue, unordered_map <string, string>  * hashmap)
 {

  if (!jvalue.is_null())
   {
    for (auto const & e : jvalue.as_object())
    {
        std::string key(conversions::to_utf8string(e.first));
        std::string value(conversions::to_utf8string(e.second.as_string()));
        (*hashmap)[key] = value;



    }

}