<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

      posted on 2014-11-14 20:19  qicosmos(江南)  閱讀(46922)  評論(5)    收藏  舉報

      導航

      主站蜘蛛池模板: 欧美成人午夜精品免费福利| 久久国产精品二国产人妻| 亚洲国产精品一二三区| а√在线中文网新版地址在线| 国产午夜视频在线观看| 蜜臀av一区二区精品字幕| 好男人视频在线播放| 人妻少妇精品中文字幕| 清纯唯美经典一区二区| 777奇米四色成人影视色区| 免费人成视频在线播放| av色国产色拍| 免费国产一区二区不卡| 污网站大全免费| 亚洲丰满熟女一区二区蜜桃| 99久久精品国产亚洲精品| 中国亚州女人69内射少妇| 国产免费无遮挡吸奶头视频| 国产精品人妇一区二区三区| 国产成人一区二区三区视频免费| 日本一区不卡高清更新二区| 国产精品内射在线免费看| 亚洲一区二区三区久久综合| 丰满无码人妻热妇无码区| 国产精品毛片在线看不卡| 亚洲精品中文字幕二区| 97欧美精品系列一区二区| 亚洲人成电影网站色mp4| 伊人久久久av老熟妇色| 国产三级a三级三级| 麻豆蜜桃av蜜臀av色欲av| 成年女人免费碰碰视频| 人妻精品动漫H无码中字| 国产一区二区三区四区五区加勒比 | 中文字幕第一页亚洲精品| 国产精品美女一区二区三| 乱码午夜-极品国产内射| 扒开双腿猛进入喷水高潮叫声| 日日躁夜夜躁狠狠久久av| 久久碰国产一区二区三区| 国产69精品久久久久久妇女迅雷|