范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

C网络库微软开源的cppRestSdk入门环境及使用示例

  #头条创作挑战赛#前言
  一般的用客户端实现Webservice有两种方式,一种是基于SOAP协议,另外一种是基于REST,并且REST协议目前是越来越流行。使用C#或者java来开发REST客户端目前是比较快捷方便的,毕竟可用的库或资源很多,但使用C++开发REST client的话就不容易了,毕竟标准C++在网络库这一块是没有标注库的,以前开发时候使用过libcurl库(C语言编写)和VC++ 的http client,或者使用Qt的QNetworkAccessManager库来进行后台api的调用,实现post、get请求进行数据处理,但或多或少都遇到过一些问题,再到后来别人推荐了微软开源的casablanca,或者叫cppRestSdk库。下面整理一下cppRestSdk库的使用及一些入门示例代码。1、cpprestsdk介绍及编译
  c++REST SDK,又叫卡萨布兰卡,是一个微软发布的C++基于云的客户机-服务器通信库。该库基于现代化的C++异步API,即Promise模型或叫链式异步模型设计,c++开发人员可以方便地连接并与服务交互。
  SDK内容特性——HTTP客户机/服务器,JSON,URI,异步流,WebSockets客户机,oAuthPPL任务[2] ——一个强大的基于c++11特性编写的异步操作模型支持平台——Windows桌面,Windows Store,Windows Phone,Ubuntu,OS X,iOS和AndroidWindows平台编译支持——VS 2012、2013年、2015、2017、2019非Windows平台编译支持——cmake包管理器支持——NuGet,仅在VS编译器支持Windows和Android平台
  cpprestsdk编译
  cpprestsdk的源代码可以在github下载:https://github.com/microsoft/cpprestsdk,但编译的过程比较复杂,因为依赖了boost、openssl等库,需要先编译这些库。常用方法有下面三种:
  github下载
  (1)使用vcpkg安装,但vcpkg这个工具本身需要先下载依赖库的各种源码,此外下载过程中很容易出现资源下载不下来的问题,相对较为麻烦,优点是自动化,只要解决vcpkg下载中的各种问题,编译什么的都是自动的。
  (2)使用Visual studio自带的NuGet package包管理器。在visual studio 新建一个c++工程,点击 "工具——NuGet 程序包管理器——管理解决方案的NuGet 程序包",打开NuGet包管理器。然后搜索cpprestsdk即可找到,本人用的VS2017IDE,效果如下:
  点击"安装"按钮进行安装,安装完成后,visual studio自动将cpprestsdk (编译后的lib、include头文件、dll文件)下载到当前项目工程文件所在的路径中。
  当然为了方便实用,也可以将编译后的lib、include头文件、dll文件拷贝到自己指定的文件夹下,作为普通的第三方库进行使用。
  2、cpprestsdk官方示例
  官方示例提供的是一个Get请求,获取url = "http://www.bing.com/search?q=cpprestsdk github"返回的html文件,运行结果是将请求到的html网页数据流保存生成results.html文件。
  运行结果
  示例代码如下: #include "stdafx.h" #include  #include  using namespace utility; // Common utilities like string conversions using namespace web; // Common features like URIs. using namespace web::http; // Common HTTP functionality using namespace web::http::client; // HTTP client features using namespace concurrency::streams; // Asynchronous streams // 官方示例 //Get请求:获取url = "http://www.bing.com/search?q=cpprestsdk github"返回的html文件; //运行结果:将请求到的html网页数据流保存生成results.html文件 /* std::wstring wsServersite = L"http://www.bing.com/"; std::wstring wsURI = L"/search"; std::wstring wsName = L"q"; std::wstring wsValue = L"cpprestsdk github"; */ void OfficialExample(const std::wstring& wsServersite, const std::wstring& wsURI, const std::wstring& wsURIName, const std::wstring& wsURIValue) { auto fileStream = std::make_shared(); // Open stream to output file. pplx::task requestTask = fstream::open_ostream(U("../x64/results.html")).then([=](ostream outFile) { *fileStream = outFile; // Create http_client to send the request. http_client client(wsServersite); //wsServersite = http://www.bing.com/ // Build request URI and start the request. uri_builder builder(wsURI); builder.append_query(wsURIName, wsURIValue); //std::wstring s1 = builder.to_string().c_str(); //std::wcout << s1 << std::endl; return client.request(methods::GET, builder.to_string()); }) // Handle response headers arriving. .then([=](http_response response) { printf("Received response status code:%u ", response.status_code()); // Write response body into the file. return response.body().read_to_end(fileStream->streambuf()); }) // Close the file stream. .then([=](size_t) { return fileStream->close(); }); // Wait for all the outstanding I/O to complete and handle any exceptions try { requestTask.wait(); } catch (const std::exception &e) { printf("Error exception:%s ", e.what()); } } int main(int argc, char* argv[]) { // 官方示例测试 std::wstring wsServersite = L"http://www.bing.com/"; std::wstring wsURI = L"/search"; std::wstring wsName = L"q"; std::wstring wsValue = L"cpprestsdk github"; OfficialExample(wsServersite, wsURI, wsName, wsValue); }
  官方代码用的C++11新特性. then 实现的异步请求,如果不适应的话可以改为同步请求数据: void OfficialExample() { auto fileStream = std::make_shared(); ostream outFile = fstream::open_ostream(U("results.html")).get(); *fileStream = outFile; // Create http_client to send the request. http_client client(U("http://www.bing.com/")); // Build request URI and start the request. uri_builder builder(U("/search")); builder.append_query(U("q"), U("cpprestsdk github")); http_response response = client.request(methods::GET, builder.to_string()).get(); // Write response body into the file. response.body().read_to_end(fileStream->streambuf()).get(); fileStream->close().get(); }3、使用自己的后台api接口进行验证,包括添加header
  1)POST接口使用: #include "stdafx.h" #include  #include  using namespace utility; // Common utilities like string conversions using namespace web; // Common features like URIs. using namespace web::http; // Common HTTP functionality using namespace web::http::client; // HTTP client features using namespace concurrency::streams; // Asynchronous streams  void TestPostRequest(const std::wstring& wsServersite, const std::wstring& wsURI, const std::wstring &userName, const std::wstring &passWord) { 	utility::stringstream_t msgStream; 	try 	{ 		json::value reqMsg; 		reqMsg[U("userName")] = json::value::string(userName); 		reqMsg[U("userPassword")] = json::value::string(passWord); 		reqMsg.serialize(msgStream); 	} 	catch (const std::exception &e) 	{ 		std::cerr << e.what() << " "; 		return; 	}  	try 	{ 		// default timeout is 30s, set to 10s 		http_client_config config; 		config.set_timeout(utility::seconds(10));  		// Create http_client to send the request. 		http_client client(wsServersite);  		// Build request URI and start the request. 		uri_builder builder(wsURI);  		// request,同步方式 		http_request Request(methods::POST); 		//Request.headers().add(L"Authorization", L"Bearer cn-5f6c09ce-2d53-4146-b6d4-45c338da581d"); 		Request.set_request_uri(builder.to_string()); 		Request.set_body(msgStream.str(), U("application/json"));  		// request,同步方式 		http_response response = client.request(Request).get(); 		//http_response response = client.request(methods::POST, builder.to_string(), msgStream.str(), U("application/json")).get(); 		if (response.status_code() == status_codes::OK) 		{ 			try 			{ 				// 从返回的json中获取字段值 				/*const json::value &jv = response.extract_json().get(); 				const web::json::object &jobj = jv.as_object(); 				auto result_code = jobj.at(U("code")).as_integer(); 				std::wstring result_msg = jobj.at(U("msg")).as_string().c_str();  				std::wcout.imbue(std::locale("chs")); 				std::wcout << "code: " << result_code << "; msg: " << result_msg << std::endl;*/  				// 输出返回的所有json内容 				std::wstring result_msg = response.extract_string().get(); 				std::wcout.imbue(std::locale("chs")); 				std::wcout << "result_msg: " << result_msg << std::endl; 			} 			catch (const std::exception &e) 			{ 				std::wcout << e.what() << std::endl; 			} 		} 		else 		{ 			std::wcout << "error:" << response.status_code() << std::endl; 		} 	} 	catch (const std::exception &e) 	{ 		std::cerr << e.what() << " "; 	} }   int main(int argc, char* argv[]) { // 测试POST接口 std::wstring userName = L"admin"; std::wstring password = L"123456"; std::wstring wsServersite = L"http://10.31.222.162:80/"; std::wstring wsURI = L"/auth/web/login"; TestPostRequest(wsServersite, wsURI,userName, password); }
  2)Get接口使用: #include "stdafx.h" #include  #include  using namespace utility; // Common utilities like string conversions using namespace web; // Common features like URIs. using namespace web::http; // Common HTTP functionality using namespace web::http::client; // HTTP client features using namespace concurrency::streams; // Asynchronous streams  void TestGetRequest(const std::wstring& wsServersite, const std::wstring& wsURI, const std::wstring& wsURIName, const std::wstring& wsURIValue) { // Open stream to output file. try { // default timeout is 30s, set to 10s http_client_config config; config.set_timeout(utility::seconds(10));  // Create http_client to send the request. http_client client(wsServersite);  // Build request URI and start the request. uri_builder builder(wsURI); builder.append_query(wsURIName, wsURIValue); // Add Header http_request Request(methods::GET); Request.headers().add(L"x-userid", L"69003613"); Request.headers().add(L"Authorization", L"Bearer cn-45c338da581d"); Request.set_request_uri(builder.to_string()); // request,同步方式 http_response response = client.request(Request).get(); if (response.status_code() == status_codes::OK) { // 输出返回的所有json内容 std::wstring result_msg = response.extract_string().get(); std::wcout.imbue(std::locale("chs")); std::wcout << "result_msg: " << result_msg << std::endl; } else { std::wcout << "error:" << response.status_code() << std::endl; } } catch (const std::exception &e) { printf("Error exception:%s ", e.what()); } } int main(int argc, char* argv[]) { std::wstring wsServersite = L"http://10.31.222.162:80/"; std::wstring wsURI = L"/messag/projects/count"; std::wstring wsName = L"projectId"; std::wstring wsValue = L"a6a6aa80-bfaf412"; TestGetRequest(wsServersite, wsURI, wsName, wsValue); return 0; }4、cppRestSdk编译包及示例源码下载
  本人采用了vc141编译cppRestSdk包,可以支持VS2015 / VS2017 / VS2019的使用,包含:include、lib、dll文件夹,提供x64位debug和release编译结果。如有兴趣可以去下载,下载地址: https://download.csdn.net/download/m0_37251750/86903716;

防民之口,甚于防川重读召公谏厉王止谤古文观止中收录国语中有一篇文章召公谏厉王止谤很有意义,我们一起来学习一下。周厉王时,昏庸无道,臣民多有议论者,召公说臣民受不了你的暴虐了,所以才有意见。周厉王没有反思自己的过失,反王莽撵刘秀的传说头条创作挑战赛在南阳西边有个地方叫扳倒井,另一个地方叫做遮山。相传这一庄和一山都是王莽撵刘秀留下来。传说在公元5年左右,刘秀在长安看到王莽不断专权,把持朝政,决定从长安返回南阳,和桂林第一家咖啡厅居然是日本高级女间谍所开,她还利用美色搞谍报1939年,广西桂林市中山路开了一家咖啡厅,名叫天鹰咖啡厅,是桂林有史以来第一家咖啡厅,但谁也没想到,咖啡厅老板娘居然是日本美女间谍,她利用咖啡厅做掩护,大肆开展谍报交易,给抗日工安土重迁的古代社会,商朝为什么迁都多达五次?如果您喜欢这篇作品,欢迎点击右上方关注。感谢您的鼓励与支持,希望能给您带来舒适的阅读体验。首都一直都是一个国家的政治经济中心,每个国家都有着自己的首都。当然也有着一些国家存在多个首71岁皇帝病重,20岁皇后却离奇被杀,背后究竟隐藏着什么样秘密?三国时期,孙吴太元元年(公元251年)11月,吴大帝孙权躺在病床上是奄奄一息,71岁的孙权迎来了他生命的最后时刻,孙吴政权也迎来了皇位交替的重要时刻。可就在这关键的时刻,太子孙亮的挖掘清代千年古墓,进入墓室专家惊恐不已,大喊不好了,封墓!是什么促使专家做出这样的决定?清朝时,清朝没有嫡长子继承制,所以阿哥之间争夺太子的内战非常激烈。最著名的是康熙时期的九子夺嫡事件。到了朱元璋建立明朝之后,最终才确立遵循嫡长子继承制宝鸡曾经的西北名城宝鸡,作为一座历史名城,曾经叱咤风云,近年来,却又显得后劲不足。看看宝鸡,回顾一下宝鸡。1。近现代发展史当代宝鸡城,近百年建城史,始于抗战,兴于建国初,旺于三线时期及改开初期,发展魏源有心报国,无力回天魏源生平初高中历史课堂上大家肯定都学习了解过魏源,他是清朝著名启蒙家思想家文学家。他是湖南省邵阳市隆回县司门前(原邵阳县金潭)人,道光二年(1822年)举人,道光二十五年(1845杨颖关喆低调现身酒吧被偶遇,多年好友关系亲密,男方紧跟baby身近日,有网友在社交平台上晒出偶遇知名女星Angelababy(杨颖)和歌手关喆的画面,从网友晒出的视频中能看出当天两人一同现身酒吧,非常的低调,只不过还是被眼尖的网友发现,并且两人中国历史上死了那么多人,为何坟地很少?有一条简直毛骨悚然!自从人类诞生以来,有人估计大约死去了1000亿人以上,可是为何见不到那么多的坟地呢?这些人的坟头到底去哪里了呢?众所周知人类是猿类进化而来的,最早的人类出现在300万到400万年前在这个领域落后美国10多年这句话,让她燃烧10年文中国科学报记者张双虎黄辛朱美萍在观察光学元件表面质量。受访者供图激光薄膜就像一面特殊的镜子,通过特定的角度反射或透射,引导激光束按照预设的方向传输。因此,激光薄膜不但需要精确引导
法相尊严先秦法家核心思想及其现代启示摘要法家,一个一直以来就受到非议的先秦学派。在阶级史观主导下的中国史学界,更是以苛政猛于虎,残酷剥削劳动人民等观点批驳法家的各种政治理论。在提倡文明史观的今天,前者由于过分片面显然泰国苏梅岛迎来2023首艘豪华邮轮预计创收500万1月15日,据泰媒报道称,豪华邮轮MeinSchiff5于近日抵达泰国苏梅岛,也是2023年首艘前往该地的豪华邮轮。当天内,有超过3,000名欧洲游客上岛观光购物,预计将为该地区带严嵩倒台后,刑部尚书要给严世蕃定罪,徐阶你想他死还是要他活严世蕃,短项肥体,眇一目,由父任入仕。明史奸臣传严世蕃奸臣当道佞臣难除,在我国上下五千年的历史中出现了不少媚上的奸臣恶徒,秦桧杨国忠等人比比皆是,这些奸臣都有一个共同特点,那就是陷让他多活几年,功绩堪比秦皇汉武,可惜天妒英才魏晋南北朝时期,混战不断,各个政权交替,民不聊生。然而,却有这么一位皇帝鲜为人知,他诛权臣,灭佛重儒,以开太平。这就是北周武帝宇文邕。在统一北方后,北周武帝只需完成最后一步,他在历明朝最怎悲惨一的皇帝明光宗朱常洛到底有多惨?末代皇帝都处在困难时期,大都遭遇意外,尤其是年纪轻轻就不知道如何继承皇位的皇帝。然而,在明朝的历史上,有一位皇帝的下场非常悲惨。他的苦难不是朝廷的没落和外人的折磨,而是皇室造就了他20岁的东吴皇后潘淑,照顾71岁病重的孙权时,被7个宫女活活勒死公元252年,71岁的孙权病重。他年轻貌美只有20岁的潘皇后满脸担心,衣不解带的侍奉在床榻前照顾他。时间一久,潘皇后太过劳累,就趴在榻边睡着了。可是谁都没有想到,就是这一睡,却让她浙商财险总经理悬空6年终补缺,偿付能力数据不真实遭监管通报文记者何秀兰岁末年初,多家险企走马换将。浙商财产保险股份有限公司(下称浙商财险)悬空逾6年的总经理职位终于尘埃落定,而其第二大股东或将易主。浙商财险近日公告,根据浙江银保监局的批复诸城历任县(市)委书记县(市)长诸城历任县(市)委书记1927年9月诸城第一个党支部西楼子党支部成立,孙仲衢任书记1928年8月省常委刘俊才酝酿成立中共诸城特支,曹福山任特支书记。时有党员38人,辖6个党支。19金融行业年度盘点上市晋企重回40家北交所成倍增计划实施主战场上市公司是资本市场的基石,亦是支持经济发展的重要力量。2022年,是山西企业上市倍增计划实施的第一个完整年度,这一年,山西持续推动构建多层次资本市场,其中,北交所成为晋企上市倍增计萌娃出动!攀树飞盘独轮车罗湖这场户外活动太赞了太可爱了吧!前方萌娃出没忍不住想rua这是哪里?!欢迎来到活泼身心,启发智慧罗湖全民公益活动日活动的现场近日,由罗湖区文化广电旅游体育局主办,深圳市罗湖中财投资发展公司深圳市罗湖区面对EVE强大的领主级战列舰时,小矿车该如何正确应对呢?在EVE世界里面,玩家玩的不是游戏,而是船,什么样子的战列舰是最强的,那什么都不用说,这个绝对是我们玩家最为之喜爱的,但有些时候啊,大家看到的,只是表面现象而已,实际上,一艘战列舰