从 http 流中读取和写入有什么要求(在 boost::beast 中)?

What are the requirements to read and write from an http stream (in boost::beast)?

本文关键字:boost beast 什么 读取 http      更新时间:2023-10-16

我想使用 boost::beast 来读取和写入 etcd。首先,我希望能够用助推兽来做这些例子。它们很容易用卷发来做。etcd 可以看作是一个键/值存储。设置/获取的函数(示例页面中的放置/范围)很容易使用 boost::beast 客户端示例。那里没有问题。

但是"看",我不明白。根据文档,观看是一个连续的流,不像其他会话是在检索结果后立即死亡的会话。卷曲示例显示了在手表仍处于活动状态时更改值和现场响应。我应该使用相同的流来执行与该手表相关的所有操作,包括停止它。

我的问题是:如何在boost::beast中实现这一点

假设从客户端示例中,我通过一个线程提交ioc.run

std::thread t(&std::iocontext::run, &ioc);
t.detach();

现在我可以完全控制主线程中的客户端。我是否应该创建新的 http 请求并通过套接字对象以async_write提交它们?但是如果我这样做,我就会失去 boost::beast 的功能,即用漂亮的http::request<http::string_body>包装 http 标头。我应该手动创建标题吗?还是我应该只发送带有某种行终止符的json来指示消息已结束?通信协议是什么样的?

一个带有boost::beast的例子会很棒。

看起来 etcd 使用"长时间运行的请求"。为此,您希望使用http::read_header[1] 或http::async_read_header[2] 来获取响应标头,然后在循环中使用http::read_some[3] 或http::async_read_some[4] 来读取响应正文的部分内容。为了干净地工作,您需要使用专为此类事情设计的http::buffer_body[5]。文档中的HTTP Relay示例[6]演示了buffer_body的使用,并且可以适应处理长时间运行的请求。

[1] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__read_header/overload2.html

[2] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__async_read_header.html

[3] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__read_some/overload2.html

{4] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__async_read_some.html

[5] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__buffer_body.html

[6] https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/more_examples/http_relay.html