现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34196 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

27 | C++ REST SDK:使用现代C++开发网络应用

Christopher Kohlhoff, Boost.Asio
Milo Yip, nativejson-benchmark
Tencent, rapidjson
Niels Lohmann, json
JSON
curl
RESTful
维基百科, “超文本传输协议”
Wikipedia, “Hypertext Transfer Protocol”
Microsoft, cpprestsdk
线程池控制
处理 GET 请求
C++ REST SDK 中的 JSON
JSON 的复合类型
JSON 的基本类型
异步读写文件
macOS Clang
Linux GCC
Windows MSVC
OAuth 客户端
WebSocket 客户端
异步流
URI
任务
HTTP 客户端
参考资料
课后思考
内容小结
关于线程的细节
HTTP 服务器
JSON 支持
异步流
安装和编译
初识 C++ REST SDK
C++ REST SDK

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
在实战篇,我们最后要讲解的一个库是 C++ REST SDK(也写作 cpprestsdk)[1],一个支持 HTTP 协议 [2]、主要用于 RESTful [3] 接口开发的 C++ 库。

初识 C++ REST SDK

向你提一个问题,你认为用多少行代码可以写出一个类似于 curl [4] 的 HTTP 客户端?
使用 C++ REST SDK 的话,答案是,只需要五十多行有效代码(即使是适配到我们目前的窄小的手机屏幕上)。请看:
#include <iostream>
#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif
#include <cpprest/http_client.h>
using namespace utility;
using namespace web::http;
using namespace web::http::client;
using std::cerr;
using std::endl;
#ifdef _WIN32
#define tcout std::wcout
#else
#define tcout std::cout
#endif
auto get_headers(http_response resp)
{
auto headers = resp.to_string();
auto end =
headers.find(U("\r\n\r\n"));
if (end != string_t::npos) {
headers.resize(end + 4);
};
return headers;
}
auto get_request(string_t uri)
{
http_client client{uri};
// 用 GET 方式发起一个客户端请求
auto request =
client.request(methods::GET)
.then([](http_response resp) {
if (resp.status_code() !=
status_codes::OK) {
// 不 OK,显示当前响应信息
auto headers =
get_headers(resp);
tcout << headers;
}
// 进一步取出完整响应
return resp
.extract_string();
})
.then([](string_t str) {
// 输出到终端
tcout << str;
});
return request;
}
#ifdef _WIN32
int wmain(int argc, wchar_t* argv[])
#else
int main(int argc, char* argv[])
#endif
{
#ifdef _WIN32
_setmode(_fileno(stdout),
_O_WTEXT);
#endif
if (argc != 2) {
cerr << "A URL is needed\n";
return 1;
}
// 等待请求及其关联处理全部完成
try {
auto request =
get_request(argv[1]);
request.wait();
}
// 处理请求过程中产生的异常
catch (const std::exception& e) {
cerr << "Error exception: "
<< e.what() << endl;
return 1;
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C++ REST SDK是一个现代C++库,用于支持HTTP协议和RESTful接口开发。它提供了丰富的功能,包括HTTP客户端、HTTP服务器、任务、JSON、URI、异步流、WebSocket客户端和OAuth客户端。本文介绍了C++ REST SDK的安装和编译方法,以及其对JSON的支持。在示例代码中展示了如何使用C++ REST SDK进行HTTP请求的发起和处理,以及异步处理的方式。此外,文章还展示了如何使用C++ REST SDK实现对文件的异步读写,进一步展示了其强大的异步处理能力。C++ REST SDK使用异步编程模式,底层使用线程池来实现,但需要注意线程数量的控制。文章还介绍了如何使用C++ REST SDK快速搭建一个HTTP服务器,并对线程的细节进行了讨论。总的来说,C++ REST SDK是一个功能丰富、易用的现代C++库,适用于开发各种网络应用。文章内容涵盖了C++ REST SDK的主要功能和异步编程方式,为读者提供了全面的概览。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 幻境之桥
    吴老师要是可以把所有的内容都使用 cmake 来构建,以后参考起来可以更方便啊

    作者回复: 这要花时间的……用 CMake 的来顶这个评论,人多我就考虑一下。 更新:我听到大家的声音了。CMake 用户的福利在这里: https://github.com/adah1972/geek_time_cpp 有空时我会继续更新。

    2020-02-03
    2
    91
  • 大土豆
    老师,您认为现在这种前后端分离的架构,服务端不输出页面,纯粹只输出json的情况下,为什么C++在Http Rest API的服务端还没有广泛的应用?目前大多数还是Java(spring)或者PHP,C++基本没份额

    作者回复: 使用C++的话: 得——性能; 失——开发效率。 关键在于损失的开发效率跟获得的性能比,值不值。如果你的应用瓶颈在数据库,显然不值。如果瓶颈在CPU和内存,可能就值了——如果你的应用很热门,需要很多台服务器部署的话。单台服务器的应用很可能就不值了,因为服务器便宜,开发人员的工资贵。 游戏后台之类的服务器常常是用C++写的。没记错的话,Google的搜索引擎也是C++。

    2020-04-07
    6
  • 阿鼎
    项目用vs2010,而目前可选的restful库大多是c++11的。请问老师,通过何种手段,可以使用c11库?

    作者回复: 第一步,升级。你在用十年前的老工具诶。

    2020-05-16
    4
  • 心情难以平静
    coroutine现在有好多轮子。希望标准实现快点到来。据说里面的坑较多,希望有人能先帮忙踩一踩。

    作者回复: (C++20)协程是第 30 讲的内容。在 MSVC 和 Clang 已经基本可用了。坑,总得用了之后才知道有多少的……

    2020-02-03
    2
  • Geek_c18718
    吴老师,运行结果为A URL is needed,我应该去哪输入URL;完整的输入输出调用函数应该是什么样的呢?

    作者回复: 命令行上输入。假设你用的是Windows,用的是我给出的命令行,一个示例执行可能就是: test.exe "http://wyw.dcweb.cn/" 最后一问的意思我没看明白。请另起一个新问题,详细描述一下。

    2021-06-18
    1
  • Geek_611a57
    在准备搭建一个HTTP网关,有两个问题请教: 1. 异步流例子里哪里体现异步?看着好像是要等所有task都完成才返回?异步的需求是发送之后不等,有结果返回时候回调。 2. 跟libcurl相比,哪个更适合应用于HTTP网关?

    作者回复: 所谓异步,是指你不是等待系统返回上一次的结果后进行下一步的操作(常见的同步做法),而是告诉系统,在上一次的操作执行结束后,然后给我去执行某段代码(then)。但异步的代码也会有个同步点,叫wait、get之类。程序整体还是用continuation的方式实现的,用then串起来。 C++ REST SDK还是有个缺点,它虽然使用了异步的编程模式,但它的实现使用了多个线程,而非类似协程那种的真正异步,因此并发数有上限(默认是40)。如果你的并发数不高,或者手工调整这个数值,做网关是没有问题的,我实际就拿它做过请求缓存网关。比起用libcurl这种,代码应该是简洁了不少,但调试起来复杂些,坑也不一样。不同的人会有不同的取舍吧。

    2021-01-08
    1
  • 可爱的小奶狗
    g++ -std=c++17 -pthread test.cpp -lcpprest -lcrypto -lssl -lboost_thread -lboost_chrono -lboost_system 老师,这段手工在linux上编译test.cpp的命令,你咋知道要链接这些库呢?纯靠经验还是根据github上cpprestsdk这个项目release下的cmakelists.txt推断出出来的。

    作者回复: 都有。最早就是在各平台上自己查文档、试验出来的。后来用了cmake,就会去参考它的规则。这种项目,确实用cmake轻松多了,因为在各个平台上需要链接的库是不一样的。

    2020-05-24
    1
  • 莫珣
    cpprest这个库在linux下编译起来真是太麻烦了,今天折腾了大半天竟然没有编译出来。github上给出的编译步骤过于简单。

    作者回复: 遇到特定困难可以网上搜一下。我印象里,依赖装好之后,Linux上编译还是不麻烦的。你不是因为 GCC 版本太低吧? 实际上,这虽然是微软出的,我觉得还是在 Windows 上编译更麻烦呢……

    2020-02-04
    2
    1
  • hey
    支持https吗

    作者回复: 支持。客户端直接用。服务器端麻烦点,根据平台不同有不同的配置方法。

    2020-02-03
    1
  • 江湖中人
    老师,我想把老项目里自定义消息体TCP传输的方式都改成RPC接口方式,不知道可行不,您有什么建议吗?

    作者回复: RPC 是个很通用的名词,不是一种具体协议,所以,这个问题不那么好回答……从理论上讲,当然时可以的。取决于你使用什么 RPC 方式,性能有可能会受到影响;具体是不是一个问题,就需要你自己评估了。 往好里讲,一个通用的 RPC 方式会让代码更加简单和可维护,比起手写传输代码还是有很大优势的。

    2022-06-09
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部