现代C++实战30讲
吴咏炜
前 Intel 资深软件架构师
立即订阅
3995 人已学习
课程目录
已更新 33 讲 / 共 33 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | C++这么难,为什么我们还要用C++?
免费
课前必读 | 有关术语发音及环境要求
基础篇 (9讲)
01 | 堆、栈、RAII:C++里该如何管理资源?
02 | 自己动手,实现C++的智能指针
03 | 右值和移动究竟解决了什么问题?
04 | 容器汇编 I:比较简单的若干容器
05 | 容器汇编 II:需要函数对象的容器
06 | 异常:用还是不用,这是个问题
07 | 迭代器和好用的新for循环
08 | 易用性改进 I:自动类型推断和初始化
09 | 易用性改进 II:字面量、静态断言和成员函数说明符
提高篇 (11讲)
10 | 到底应不应该返回对象?
11 | Unicode:进入多文字支持的世界
12 | 编译期多态:泛型编程和模板入门
13 | 编译期能做些什么?一个完整的计算世界
14 | SFINAE:不是错误的替换失败是怎么回事?
15 | constexpr:一个常态的世界
16 | 函数对象和lambda:进入函数式编程
17 | 函数式编程:一种越来越流行的编程范式
18 | 应用可变模板和tuple的编译期技巧
19 | thread和future:领略异步中的未来
20 | 内存模型和atomic:理解并发的复杂性
实战篇 (7讲)
21 | 工具漫谈:编译、格式化、代码检查、排错各显身手
22 | 处理数据类型变化和错误:optional、variant、expected和Herbception
23 | 数字计算:介绍线性代数和数值计算库
24 | Boost:你需要的“瑞士军刀”
25 | 两个单元测试库:C++里如何进行单元测试?
26 | Easylogging++和spdlog:两个好用的日志库
27 | C++ REST SDK:使用现代C++开发网络应用
新年特别策划 (2讲)
新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免
新春福利 | C++好书荐读
未来篇 (2讲)
28 | Concepts:如何对模板进行约束?
29 | Ranges:无迭代器的迭代和更方便的组合
现代C++实战30讲
登录|注册

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

吴咏炜 2020-02-03
你好,我是吴咏炜。
在实战篇,我们最后要讲解的一个库是 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《现代C++实战30讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

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

    作者回复: 这要花时间的……用cmake的来顶这个评论,人多我就考虑一下。

    2020-02-03
    1
    17
  • 申学晋
    只用过cpprest开发客户端,在windows下字符串处理还是有点麻烦。最近想开发WebSocket服务器,不知道是否能用?

    作者回复: 还行吧,坑我也标出来了。全部用 wcout(tcout)一般就可以用。

    WebSocket支持我没用过,给不了建议。

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

    作者回复: 遇到特定困难可以网上搜一下。我印象里,依赖装好之后,Linux上编译还是不麻烦的。你不是因为 GCC 版本太低吧?

    实际上,这虽然是微软出的,我觉得还是在 Windows 上编译更麻烦呢……

    2020-02-04
    1
  • hb
    支持https吗

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

    2020-02-03
  • tt
    我觉得纯从网路编程上来说,比起直接用EPOLL,然后加上一堆线程、队列、锁、条件变量啥的方便多了,隐藏了事件和循环,还是方便多了。
    和JAVASCRIPT中的PROMISE已经非常像了。

    作者回复: 那是肯定的,否则我介绍它干嘛……

    但话说回来,如果你的服务器性能要求非常高,这个方案就不一定适合了。一个并发连接目前还是需要一个线程的。

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

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

    2020-02-03
收起评论
6
返回
顶部