程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ REST SDK的基本用法

C++ REST SDK的基本用法

編輯:C++入門知識

C++ REST SDK的基本用法


微軟開發了一個開源跨平台的http庫--C++ REST SDK(http://casablanca.codeplex.com/),又名卡薩布蘭卡Casablanca,有個電影也叫這個名字,也許這個庫的作者很喜歡這個電影吧。從REST SDK這個名字可以看出它是處理rest API的,對REST不了解的童鞋可以點這裡和這裡,由於REST API的請求支持application/x-www-form-urlencoded、application/json、application/octet-stream等多種編碼方式,REST API的返回值都是json形式,很方便返回對象。Casablanca采用c++11開發,集成了PPL和asio,支持異步數據流和web socket,用起來很方便。下面來看看官方的一個例子吧:   #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::ostream>();     pplx::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(U("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;     } }   這個例子把從bing.com上查詢“Casablanca CodePlex”的內容保存到一個本地文件result.html中,用到了ppl的串行任務。啟用了四個異步任務,第一個任務是打開一個文件流,接著,發起了第二個任務,用於發起一個查詢請求,然後,第三個任務等待請求的響應,並將響應的結果輸入到文件中去,第四個任務是關閉文件流。要注意rest sdk的字符相關的入參是寬字符(wchr_t)。這種處理http的方式讓我們處理http的流程變得很清晰,有點小清新^_^,不過,這對於不太熟悉ppl用法的童鞋可能有點難接受,沒關系,讓我來簡化一下,簡化成同步方式,看得就更清楚了。   復制代碼 void TestRequest() {     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(); } 復制代碼   注意上面的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真是個好東西,值得我們深入去研究。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved