我想使用boost::beast来读写etcd。首先,我希望能够用增强兽做these examples。它们很容易 curl 。 Etcd可以看作是键/值存储。使用boost::beast client example可以轻松设置/获取(在示例页面中输入/范围)功能。那里没有问题。

但是“看”,我听不懂。根据docs,watch是连续的流,与其他 session 不同, session 是在检索结果后立即终止的 session 。 curl 示例显示了在手表仍处于 Activity 状态时实时更改值和响应的情况。我应该使用相同的流来执行与该手表相关的所有操作,包括停止它。

我的问题大致是:如何在boost::beast 中实现呢?

假设从client example I submit ioc.run through a thread

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

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

一个带有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

10-08 08:37