Microsoft has developed an open source cross-platform HTTP library--c++ REST SDK (http://casablanca.codeplex.com/), also known as Casablanca Casablanca, a film called this name, perhaps the author of this library is very fond of this movie. As you can see from the rest SDK, it is the rest API, and the children's shoes that are not known to rest can be ordered here and here, as the rest API requests support for application/x-www-form-urlencoded, application/ JSON, Application/octet-stream and other encoding methods, the REST API return values are in JSON form, it is convenient to return objects. Casablanca is developed using C++11, integrates ppl and ASIO, supports asynchronous data streams and Web sockets, and is handy to use. Let's take a look at the official example below:
#include <cpprest\http_client.h> #include <cpprest\ Filestream.h>using namespace utility;using namespace web;using namespace web::http;using namespace Web::http:: Client;using namespace Concurrency;void testrequest () {Auto FileStream = Std::make_shared<concurrency::streams::o Stream> ();pp lx::task<void> requesttask = Concurrency::streams::fstream::open_ostream (U ("result.html")). Then ([=] (Concurrency::streams::ostream outFile) {*filestream = Outfile;http_client client (U ("http://www.bing.com/") ); Uri_builder Builder (U ("/search")), Builder.append_query ("Q"), U ("Casablanca CodePlex"), Return Client.request ( Methods::get, builder.to_string ());}). Then ([=] (Http_response response) {return response.body (). Read_to_end (Filestream->streambuf ());}). Then ([=] (size_t len) {return filestream->close ();}); Try{requesttask.wait ();} catch (const std::exception& e) {cout << e.what () << Endl;}}
This example saves the contents of the query "Casablanca CodePlex" from Bing.com to a local file result.html, using the PPL serial task. With four asynchronous tasks enabled, the first task is to open a file stream, and then a second task is initiated to initiate a query request, and then the third task waits for the response of the request and enters the result of the response into the file, and the fourth task is to close the file stream. Note that the character-related entry parameters for the rest SDK are wide characters (wchr_t). This way of handling HTTP allows us to process the HTTP process becomes very clear, a little fresh ^_^, however, this is not familiar with the PPL usage of children's shoes may be a bit difficult to accept, it's okay, let me simplify, simplify to synchronize, see more clearly.
voidtestrequest () {Auto FileStream= std::make_shared<concurrency::streams::ostream>(); Concurrency::streams::ostream OutFile= Concurrency::streams::fstream::open_ostream (U ("result11.html")).Get(); *filestream =OutFile; Http_client Client (L"http://www.bing.com/"); Uri_builder Builder (L"/search"); Builder.append_query (L"Q", L"Casablanca CodePlex"); Http_response Response= Client.request (Methods::get, builder.to_string ()).Get(); Response.body (). Read_to_end (FileStream->streambuf ()).Get(); FileStream->close ().Get();}
Note that the get () method above blocks the wait for an asynchronous thread to complete the operation. This simplification will make it clearer how to use the rest SDK, and here are a few objects that initiate HTTP operations. Http_client represents the client and requires it to initiate an HTTP request. Rest API is generally based on a basic URL to add some URLs, such as the previous example of search, there may be some URL parameters, at this time, we need to uri_builder to do these stitching URLs and parameters of things, it is very simple to use.
uri_builder Builder;builder.append_path (L"search"// add URL Builder.append_query (L"q", L"Casablanca CodePlex" Add URL parameter
After the URL and parameters are ready to initiate the request, the request can be used Methods::get and methods::P OST, and so on.
Client.request (Methods::get, builder.to_string ()). Get ();
In the example above, there is no request body, and sometimes we need the request body for the HTTP request, usually JSON or binary format, to see the example of the request body in the Post JSON format, rest The SDK provides JSON objects to parse JSON, which is also handy:
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::P OST, Builder.to_string (), Obj.serialize (), L"Application/json");
If the request body is in binary format, this will be the case:
wchar_t buf[] == Client.request (methods::P OST, Builder.to_string (), buf/*L "" * *, L"application/octet-stream"). Get ();
After the request is initiated, it waits for the HTTP response, and the rest API returns the results in JSON format, so we need to parse the JSON object, and the rest SDK provides the Http_response object to handle the response. Suppose the result of the HTTP response is this:
{ "result":"service failed" " Error_code " - }
Handling of HTTP responses:
if(Response.status_code () = =Status_codes::ok) { Try{result=true; Constjson::value& JV = Response.extract_json ().Get(); ConstWeb::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(Conststd::exception&e) {cout<< e.what () <<Endl; }}
The output of wide characters with wcout requires an initialization, otherwise it may not output content.
Wcout.imbue (the locale ("CHS")); // localization
We can also set the relevant HTTP properties, http_client the default time-out is 30 seconds, we can also set the time-out:
http_client_config config;config.set_timeout (utility::seconds// set to 90-second timeout Http_client Client (URL, config);
Summary: You can see the use of the C + + REST SDK is very simple, URI parsing and splicing, JSON processing, request and response processing have corresponding objects, we use it is very worry. The C + + REST SDK provided by Microsoft is really a good thing, and deserves our deep research.
Basic usage of the C + + REST SDK