C++ REST SDK的基本用法

2023-05-16

  微软开发了一个开源跨平台的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真是个好东西,值得我们深入去研究。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Linux性能监测:磁盘IO篇

    Linux性能监测 xff1a 磁盘IO篇 计算机最慢的子系统 xff0c 也是最容易出现性能瓶颈的地方 xff0c 因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作 xff0c 比如转轴 寻轨等 访问硬盘和访问内存之间的
  • 多媒体指令(图像灰度化)

    权当练手了 xff0c 效果不好 xff0c cpu没有提供pmulluw这样一个无符号字相乘指令 处理的效果和matlab明显不同 xff0c 尤其是背景 xff0c 我实在找不出问题在哪里 xff0c 最可能就在寄存器符号上 灰度公式是
  • jni 中的 extern "C" 分析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 先看一段jni自动生成的源代码 code DO NOT EDIT THIS FILE it is machine generated include lt jni h gt
  • Engine实现国密算法SM4 ECB/CBC 模式的代码和逻辑图

    相应的 struct EVP sms4 cbc Encrypt Decrypt SKF SMS4实现 查看源文件 xff0c 暂不提供 执行测试
  • Java中的箭头——Lambda表达式

    转自 xff1a Java 8 Lambda 表达式 菜鸟教程 Lambda 表达式 xff0c 也可称为闭包 xff0c 它是推动 Java 8 发布的最重要新特性 Lambda 允许把函数作为一个方法的参数 xff08 函数作为参数传递
  • Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置

    如果要在Linux上做j2ee开发 xff0c 首先得搭建好j2ee的开发环境 xff0c 包括了jdk tomcat eclipse的安装 这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS 七 CentOS下j2ee环境
  • selenium.common.exceptions.WebDriverException: Message: "Can't load the profile.

    记录一下 xff0c Selenium在最新版本中修好了这个问题 运行CMD xff0c 然后输入 pip install U selenium
  • 网页跳转(APP内/浏览器)

    APP内网页跳转 xff1a xml lt WebView android layout below 61 span class hljs string 34 64 id lunbo 34 span android layout width
  • Intellij IDEA Resource Bundle

    Resource Bundle是什么 可以直接通过官方的描述来了解 https www jetbrains com hel Resource bundle is a set of properties files that have sam
  • H3C配置日志主机

    华三网络设备信息级别共有8级 xff0c 从高到底分别为emergencies alerts critical errors warnings notifications infomational debugging 信息级别数值描述eme
  • MIUI11系统怎么样刷入开发版获得Root超级权限

    小米的手机或平板不同手机型号一般情况下官网都提供两个不同的安卓系统版本 xff0c 可分为稳定版和开发版 xff0c 稳定版没有提供root权限管理 xff0c 开发版中就开启了root权限 xff0c 很多时候我们需要使用的一些功能强大的
  • 一起来看React(路由守卫)

    我们在很多时候都会接触到路由守卫 gt 无论是不是做 代码小子 的人 我们在浏览各网页时会看到头部的网址 如 xff1a 当我们在逛 xff1a 淘宝 天猫 京东 这一类的网站时我们自定义输入地址时 我们应该先登录 如果没登录我们应该跳转到
  • filezilla无法启动传输及严重文件传输错误

    filezilla无法启动传输 严重文件传输错误 文件夹权限不够 xff0c 修改之 你的空间或服务器已经满了 xff0c 请空下回收站或者扩容 文件正在被占用 xff0c 关闭后传输 转载于 https www cnblogs com w
  • 用KeyTool生成安全证书

    详细请见 xff1a Tomcat的帮助文档 xff0c xff1a https localhost 8080 tomcat docs ssl howto html 1 用keytool 生成证书 xff1a keytool genkey
  • Scheduling and emailing PeopleSoft Query results

    You could E Mail the Query results by embedding the paramters in a nVision Layout Create a Tabular nVision Layout Add th
  • VS2022 添加 dll 库文件

    参考链接 Visual Studio中的C 43 43 程序如何使用第三方静态库和动态库 xff1f 掘金 1 xff0c 添加库文件路径 在 Visual Studio 2022 中 xff0c 可以通过在项目属性页面中添加库文件的目录
  • OD常用断点(转载)

    常用断点 OD中 拦截窗口 xff1a bp CreateWindow 创建窗口 bp CreateWindowEx A 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowTe
  • Linux curl 命令模拟 POST/GET 请求

    curl 命令 xff0c 是一个利用URL规则在命令行下工作的文件传输工具 curl 支持文件的上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称curl为下载工具 作为一款强力工具 xff0c curl
  • WINserver路由服务之多网段管控

    前几天 xff0c 看见了一个朋友写的一篇文章 实现win2003路由功能 看了之后的感觉是 xff0c 只写了路由功能的安装部分 xff0c 对于功能实现之后的应用 xff0c 没怎么谈到 于是跟他交流了一下下 然后也建议他来看看我的那篇
  • ubuntu环境下实现 多线程的socket(tcp) 通信

    改改就是个小型局域网聊天 服务器端 xff1a 1 File Name process server c 2 Author jiujue 3 Created Time 2019年03月10日 星期日 20时29分18秒 4 5 includ

随机推荐

  • cpptools-srv占用内存过大_iOS“其他内存”占用过大问题分析

    今天遇到了一个有趣的关于iPhone 占用内存过大的问题 xff0c app与正常使用内存没问题 xff0c 但莫名多了很多其他内存 手机只有64g但其他占了50g 首先百度一波 xff0c 得到的答案无一是还原出厂设置 xff0c 抹掉所
  • nginx限制客户端请求数+iptables限制TCP连接和频率来防止DDOS

    DDOS的特点是分布式 xff0c 针对带宽和服务 xff0c 即四层流量 和七层应用 对于七层的应用 xff0c 如果前端是Nginx xff0c 主要使用nginx的http limit conn和http limit req模块来防御
  • Android带图片的Toast(自定义Toast)

    使用Android默认的Toast Toast简介 xff1a Toast是一个简单的消息显示框 xff0c 能够短暂的出现在屏幕的某个位置 xff0c 显示提示消息 默认的位置是屏幕的下方正中 xff0c 一般Toast的使用如下 xff
  • XML CDATA是什么?

    解析数据 XML 解析器通常情况下会处理XML文档中的所有文本 当XML元素被解析的时候 xff0c XML元素内部的文本也会被解析 lt message gt This text is also parsed lt message gt
  • TCP端口同时做服务器与客户端

    下面的代码主要实现两个功能 xff1a 1 xff0c 通过bind使本机指定端口如2012端口与远端服务器通信 xff0c 不指定的话会随机分配 2 xff0c 然后使用该指定端口创建监听服务 xff0c 接受其他客户端的连接 主要方法用
  • bat脚本禁用和开启本地连接

    netsh interface set interface name 61 34 本地连接 34 admin 61 disabled 禁用本地连接 netsh interface set interface name 61 34 本地连接
  • 一个PHP的QRcode类,与大家分享

    类的代码 View Code lt php eval gzinflate base64 decode 39 7X1td9s2svDn3nP2PzBZNZJiKRb1ZtmxvY 43 bOE3u2o5rp9u7N5v1oSTaZqO3UHQ
  • Java程序员的黄金5年,从入行到大牛的晋升之路

    在程序界流行着一种默认的说法叫 黄金5年 xff0c 也就是一个程序员从入职的时候算起 xff0c 前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向 xff0c 如何走好这5年 xff0c 彻底从一个刚入行的菜鸟蜕变成可以以不变
  • Gin 框架的路由结构浅析

    Gin 是 go 语言的一款轻量级框架 xff0c 风格简单朴素 xff0c 支持中间件 xff0c 动态路由等功能 gin项目github地址 路由是web框架的核心功能 在没有读过 gin 的代码之前 xff0c 在我眼里的路由实现是这
  • 红米手机5 Plus启用root超级权限的步骤

    红米手机5 Plus怎么开启root超级权限 xff1f 做开发的人清楚 xff0c Android机器有root超级权限 xff0c 一旦手机开启root相关权限 xff0c 就可以实现更强的功能 xff0c 举个栗子做开发的人企业的营销
  • 基于vue解决大数据表格卡顿问题

    点我在线体验Demo 请用电脑查看 亲测苹果电脑 xff0c chrome浏览器无卡顿现象 xff0c 其它浏览器并未测试 xff0c 如遇到卡顿请备注系统和浏览器 xff0c 方便我后续优化 xff0c 谢谢 先看一下效果 一共1000
  • raid1损坏一块盘之后的处理方式

    在企业生产环境中 xff0c 假如raid1两块盘中的一块损坏了 xff0c 后续如何处理 xff1f 直接换下损坏的磁盘是否会对服务有影响 xff08 如何把影响降到最低 xff09 xff0c 加入新的磁盘后是否还需要重新做raid1
  • Landsat Tm5辐射定标和大气校正(转)

    一 辐射定标 1 由于ENVI 4 4 中有专门进行辐射定标的模块 xff0c 因此实际的操作十分简单 将原始TM 影像打开以后 xff0c 选择 Basic Tools Preprocessing Calibration Utilitie
  • Traversing the Dept Security tree

    We can use the connect by prior function provided by Oracle to traverse the Dept security Tree Suppose an Organization h
  • Reconfigurable computing[可重构计算]

    在实验室跟老师做一些硬件加速相关的东西 xff0c 看文献时看到Reconfigurable computing xff0c 发现这个很有意思 现在每天都有越来越多的数据产生 xff0c 要处理这些数据如果单纯用CPU计算的话会耗费很多时间
  • 嵌入式作业STM32采用串口DMA方式发送数据

    目录 前言 要求 一 DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二 通过CubeMX配置项目 1 创建项目 2 选择芯片STM32F103C8T6 3 设置RCC 4 设置串口 5 设置
  • C ~ char int 等数据转换问题

    1 xff0c char型数字转换为int型 char a 61 34 32 34 printf 34 d n 34 a 0 39 0 39 输出结果为3 2 xff0c int转化为char 1 字符串转换成数字 xff0c 用atoi
  • curl get请求添加header头信息

    function get url ch 61 curl init curl setopt ch CURLOPT HTTPGET true curl setopt ch CURLOPT RETURNTRANSFER 1 TRUE 将curl
  • 关于 RESTFUL API 安全认证方式的一些总结

    常用认证方式 在之前的文章 REST API 安全设计指南 与 使用 AngularJS amp NodeJS 实现基于 token 的认证应用 两篇文章中 xff0c 译 web权限验证方法说明 中也详细介绍 xff0c 一般基于REST
  • C++ REST SDK的基本用法

    微软开发了一个开源跨平台的http库 C 43 43 REST SDK xff08 http casablanca codeplex com xff09 xff0c 又名卡萨布兰卡Casablanca xff0c 有个电影也叫这个名字 xf