注意上面的get()方法会阻塞等待异步线程完成操作。这样简化之后能更清晰的看到如何使用rest sdk了,下面来说说发起http操作的几个对象。 http_client代表客户端,需要它发起http请求。rest api一般是基于一个基本URL增加了一些URL,比如上例中的search,还有可能有一些url参数,这时,我们需要uri_builder来做这些拼接url和参数的事情,用起来很简单。
  uri_builder builder;
  builder.append_path(L"search"); //添加URL
  builder.append_query(L"q", L"Casablanca CodePlex"); //添加url参数
  待url和参数准备好之后可以发起请求了,请求方式可以用methods::GET和methods::POST等方式。
  client.request(methods::GET, builder.to_string()).get();
  上面的例子中并没有request body,有时候我们发起http请求还需要request body,一般是json或者二进制格式,来看一个post json格式的request body的例子,rest sdk提供了json对象来解析json,用起来也很方便:
  uri_builder builder;
  builder.append_path(L"/test");
  json::value obj;
  obj[L"Count"] = json::value::number(6);
  obj[L"Version"] = json::value::string(L"1.0");
  client.request(methods::POST, builder.to_string(), obj.serialize(), L"application/json");
  如果request body为二进制格式的话,这样发请求可以了:
  wchar_t buf[48] = {};
  http_response response = client.request(methods::POST, builder.to_string(), buf/*L""*/, L"application/octet-stream").get();
  请求发起之后等http响应了,rest api返回的结果都是json格式的,所以我们需要解析json对象,rest sdk提供了http_response对象来处理响应。假设http响应的结果是这样的:

 

{
"result":"service failed"
"error_code": 400
}
http响应的处理:
if (response.status_code() == status_codes::OK)
{
try
{
result = true;
const json::value& jv = response.extract_json().get();
const web::json::object& jobj = jv.as_object();
auto result = jobj.at(L"result").as_string();
auto access_code = result.as_object().at(L"error_code").as_string();
wcout << result<<" "<< access_code << endl;
}
catch (const std::exception& e)
{
cout << e.what() << endl;
}
}

  用wcout输出宽字符时需要做一个初始化,否则可能输出不了内容。
  wcout.imbue(locale("chs"));//本地化
  我们还可以设置相关的http属性,http_client默认的超时时间是30秒,我们也可以自己设置超时时间:
  http_client_config config;
  config.set_timeout(utility::seconds(90)); //设置为90秒超时
  http_client client(URL, config);
  总结:可以看到C++ REST SDK的用法是很简单的,uri的解析和拼接,json的处理,请求和响应的处理都有相应的对象,我们用起来很省心了。微软提供的C++ REST SDK真是个好东西,值得我们深入去研究。
  一点梦想:尽自己一份力,让c++的世界变得更美好!