我想在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
}
});
}
答案 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 service和Example 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;
}
}