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真是个好东西,值得我们深入去研究。

时间: 2024-10-20 11:20:09

C++ REST SDK的基本用法的相关文章

vmware之VMware Remote Console (VMRC) SDK(三)

前两节我们介绍了vmrc sdk的基本用法.在前面的demo中,有一个关键的问题是,我们现在所作的工作都是基于局域网的,作为应用层面上,主机不会直接暴露给用户,而是通过一系列的web service服务分配内网主机资源.那么我们这里可以做的是公网私网端口映射. 这里我们用一个port mapping来做映射.此处我们用内网来模拟公网的效果,可以在测试之前屏蔽内网主机IP,介绍通过windows策略机制屏蔽指定IP:http://www.cnblogs.com/yuefei/p/3805892.h

Android消息推送 SDK 集成指南

使用提示 本文是 Android SDK 标准的集成指南文档. 匹配的 SDK 版本为:r1.8.0及以后版本. 本文随SDK压缩包分发.在你看到本文时,可能当前的版本与本文已经不是很适配.所以建议关注在线文档: 3 分钟快速 Demo(Android):如果您想要快速地测试.感受下极光推送的效果,请参考本文在几分钟内跑通Demo. 极光推送文档网站上,有极光推送相关的所有指南.API.教程等全部的文档.包括本文档的更新版本,都会及时地发布到该网站上. 极光推送问答网站:大家除了文档之外,还有问

JPush 极光推送 实战

极光推送的"自定义消息"很给力啊,他不是发送一条消息到状态栏,而是直接把消息内容传到APP中需要的地方,估计很多APP的验证码就是通过这种形式搞出来的. 简介 官网:https://www.jpush.cn/ 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度.提高应用的留存率. 主要功能 保持与服务器的长连接,以便消息能够即时推送到达客户端 接收通知与自定义消息,并向开发者App传递相关信息

iOS - 语音云通讯

iOS SDK 2.0 语音及图片消息详解本文档将详细介绍融云的语音及图片消息接口功能及使用说明.阅读本文前,我们假设您已经阅读了融云 iOS 开发指南,并掌握融云 SDK 的基本用法. 语音消息用来发送语音片段消息,您可以通过融云客户端 IMLib 接口或 Server API 接口发送语音消息.如果您使用的是融云 IMKit 则该功能已经在 SDK 中封装好,直接使用即可.以下为通过融云 IMLib 及 Server API 发送语音消息的方法. 从客户端发送消息获取要发送的语音数据 wav

核新通达信双协议异步交易接口介绍

HxTrade_SDK介绍文档 本文档文档介绍了核新通达信双协议异步交易SDK HxTrade的用法.如果您需要该接口或者合作项目开发请联系我下载演示程序,QQ:3257418287. 市面上券商的交易软件多采用2种协议:核新和通达信SSL,这两种协议一起大约占了95%的市场份额. HxTrade接口可同时支持这两种协议,也就是支持绝大多数的券商,可直接与券商服务器进行交互,具备普通交易和信用交易.撤单.当日查询.历史查询等 功能. HxTrade采用异步方式返回结果,用户在调用API接口后无需

使用 powercli 抓取 esxi 主机的序列号

因工作需要,收集所有 esxi 主机的序列号.可以通过 vmclient 连接vcenter 查看esxi 的"配置" ,"处理器"项中的服务标记取得 信息类似如下: 一台一台的查看,复制,粘贴,还是挺痛苦的,我尝试使用 powercli 去获取.powercli 提供的内置命令没有取得相关信息的,但可以使用 vmware 对 powercli 提供的 SDK,万能的主啊. 这个命令需要在 powershell3.0以上版本使用,这个版本的一个非常好用的方法就是可以

andriod的apk文件相关的编译反编译工具

1.smali-1.2.6.jar 用途:.smali文件 转成 classes.dex文件 说明:.smali文件,类似于.class文件,可以用普通文本编辑器查看和修改. 用法举例:命令行:java -jar smali.jar classout/ -o classes.dex 下载:http://code.google.com/p/smali/downloads/list 2.baksmali-1.2.6.jar 用途:classes.dex文件 转成 .smali文件 说明:classe

最近接触的几种APP支付方式——支付宝支付

项目是在VS2017上.基于.net core 开发的web api 接口 所有的支付接入之前都要先申请好自己的商户平台,还有有一个账户用于测试使用,这些没有事先配置好,那么接下来的开发会无从下手的(个人建议),进入正题 1.首先配置好申请的商户id.支付账号id(个人建议新手最好用配置文件保存,不建议写死在代码中) 2.添加引用--AlipaySdk 3.引用添加好了后,接下来的代码与微信很类似,几乎相同,核心代码如下: sdk里面的用法有好几种,视情况而定.我用的是最后一种,具体参数源码如下

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节