1. 程式人生 > >C++ REST SDK的基本用法

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真是個好東西,值得我們深入去研究。

相關推薦

C++ REST SDK基本用法

  微軟開發了一個開源跨平臺的http庫--C++ REST SDK(http://casablanca.codeplex.com/),又名卡薩布蘭卡Casablanca,有個電影也叫這個名字,也許這個庫的作者很喜歡這個電影吧。從REST SDK這個名字可以看出它是處理rest API的,對REST不瞭解的童

C# DataSet的基本用法

一個表 column 字段 更新數據 user 恢復 row extend 註意 首先我們需要打開一個聯結: string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:/test/tes

C++ REST SDK i

view for rom rep htm dir with bsp ood Welcome! The C++ REST SDK is a Microsoft project for cloud-based client-server communication in na

使用 C++ REST SDK 進行網絡編程

art received cell stream return fstream boost creat mbo 安裝 C++ REST SDK $ brew install cpprestsdk $ brew install boost $ brew install lib

ReactiveX 學習筆記(24)使用 RxCpp + C++ REST SDK 調用 REST API

x86-64 from space ces 測試 git clone delete let ann JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一個用於測試的

C++ vector容器基本用法

vector initialize: vector<int> v1; //empty vector<int> v2(v1) ;  vector<int> v2(v1.begin(), v1.end()); vector<int

怎麼使用微軟的 ‘C++ REST SDK’?

有想學習c/c++程式設計的小夥伴要加油哦~ 微軟的SDK已經出來很久了,有些小夥伴都曾經使用過,但是呢,還是有更多小夥伴沒有能夠弄清楚,今天我麼就來看看在VS2013中怎麼使用微軟的SDK吧! SDK讓你可以在C++中使用REST服務 Visual Studio 2013中包括了

C++的一些基本用法

這篇部落格可能不是像通常的程式設計書籍一樣,從“hello world”進行一個視覺化的一個例程,主要就是對一些C++的特性,包括關鍵字的一些理解,也是用到一個整理一個,所以邏輯性和連貫性可能不是很好,純粹作為C++的一個知識積累,如果當中有不正確的地方,還請批

c:foreach的基本用法

1、迴圈遍歷,輸出所有的元素。 <c:foreach items="${list}" var="li"> ${li} </c:foreach> 注意:items 用於接收集合物件,var 定義物件接收從集合裡遍歷出的每一個元素。同時其會自動轉型。 2、迴圈遍歷,輸出一個範圍類的元素。

c++檔案流基本用法(fstream, ifstream, ostream)

前言:c++的檔案流處理其實很簡單,前提是你能夠理解它。檔案流本質是利用了一個buffer中間層。有點類似標準輸出和標準輸入一樣。 c++ IO的設計保證IO效率,同時又兼顧封裝性和易用性。本文將會講述c++檔案流的用法。 有錯誤和疏漏的地方,歡迎批評指證。 需要包含的標頭檔

c++檔案流基本用法(fstream, ifstream)

c++的檔案流處理其實很簡單,前提是你能夠理解它。檔案流本質是利用了一個buffer中間層。有點類似標準輸出和標準輸入一樣。c++ IO的設計保證IO效率,同時又兼顧封裝性和易用性。本文將會講述c++檔案流的用法。有錯誤和疏漏的地方,歡迎批評指證。需要包含的標頭檔案: <

c++ string 類基本用法樣例

#include  < string > //   使用 string 類時須包含這個檔案 #include  < iostream > using namespace  std; int  main() {      string  st

[C#]正則表達式的基本用法

是否 lin d+ rem 正則 模式 arch mat [0 C#正則表達式的基本用法 正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串

c-3:位運算:位運算基本用法

基本操作 1.與運算(AND):0 AND 0 = 0  (全為1才得1)                     1 AND 0 = 0        

c++中函式的基本用法(學生筆記)

使用函式首先要定義函式。 例如: void printmessage() { cout<<“How do you do!”<<endl;} 函式呼叫時應明白形式引數和實際引數的區別。 例如: void abc(int a,int b,int c) 其中a,b,c就為形

C#中的XML基本用法

XML的基本用法 新建XML文件 public static void CreateXML() { /* * XML:可擴充套件的標記語言 * 用於儲存資料,類似於小型資料庫

C/C++中一些基本的輸入輸出用法

1.scanf()與printf() %c格式能夠識別空格和換行並將其輸入 %s通過空格和換行來識別字符串的結束 2.getchar()與putchar() 用來輸入和輸出單個字元 3.gets()與puts() 用來輸入一行字串,gets()識別換行符來

關於c++中const的基本用法

c++中的const 有點類似於c裡的巨集定義#define,但是似乎是在巨集定義基礎上的程式碼優化,具體我解釋不清,下面主要提到的是 const 在c++中的3中基本用法: 1.指向常量的指標 例如:const char*  pc=“sada"; 含義:宣告一個名為

C++ std::string 不可初始化為NULL及基本用法

偶然看到一個問題順便總結一下stdstring">偶然看到一個問題,順便總結一下std::string C++ basic_string::_S_construct null not valid stackoverflow例子 std::string 字

c++中STL中的next_permutation函式基本用法

對於next_permutation函式是針對於排列組合問題的庫函式,它的排序方式是按照字典的方式排列的·: 如以下程式碼對於next_permutation函式的初步解釋: #include<cstdio> #include<cstring> #