将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
Convert boost serialized object's asio::streambuf representation into Beast's DynamicBody req.body()
// Serialize using boost serialization
boost::asio::streambuf binary_buffer;
boost::archive::binary_oarchive archive(binary_buffer);
archive << world_map;
//beast::buffers_adaptor<boost::asio::streambuf>(binary_buffer);
req.body().data() = beast::buffers_adaptor<boost::asio::streambuf>(binary_buffer);
我有这段代码,我尝试将 streambuf 转换为 req.body((,以便我可以将其发送到服务器。 浏览示例,我无法弄清楚正确的转换是什么。 buffers_adaptor似乎接受了一个可变缓冲区,而不是由asio::streambuf产生的ConstBuffer。
我该如何解决这个问题?
有了dynamic_body
,body(( 实际上是一个multi_buffer
。
所以你需要复制到那个:
req.body().prepare(binary_buffer.size());
req.body().commit(binary_buffer.size());
auto n = asio::buffer_copy(req.body().data(), binary_buffer.data());
例:
req.body().prepare(binary_buffer.size());
req.body().commit(binary_buffer.size());
auto n = asio::buffer_copy(req.body().data(), binary_buffer.data());
req.target("http://example.com");
req.method(http::verb::post);
req.set(http::field::host, "example.com");
req.content_length(n);
std::cout << req << std::endl;
指纹
POST http://example.com HTTP/1.1
Host: example.coml
Content-Length: 41
22 serialization::archive 18 9 world_map
简化
直接序列化到正文缓冲区中会更便宜。您可以使用Boost Iostreams,例如vector_body
:
住在科里鲁
#include <boost/asio/streambuf.hpp>
#include <boost/beast.hpp>
#include <boost/beast/http.hpp>
namespace asio = boost::asio;
namespace beast = boost::beast;
namespace http = beast::http;
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/stream_buffer.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <iostream>
int main() {
http::request<http::vector_body<char> > req;
{
namespace io = boost::iostreams;
using D = io::back_insert_device<std::vector<char> >;
io::stream_buffer<D> sb(req.body());
{
std::ostream os(&sb);
std::string world_map = "world_map"; // for demo
boost::archive::text_oarchive archive(os);
archive << world_map;
}
}
req.target("http://example.com");
req.method(http::verb::post);
req.set(http::field::host, "example.com");
req.content_length(req.body().size());
std::cout << req << std::endl;
}
指纹
POST http://example.com HTTP/1.1
Host: example.com
Content-Length: 41
22 serialization::archive 18 9 world_map
相关文章:
- 如何在boost beast http请求中设置http头
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 带有 Boost.Beast 的异步读取标头
- 如何使用 boost beast websocket 客户端收听 websocket feed?
- Boost (Beast) websocket:同步写入挂起
- 如何使用boost/beast从HTTP POST请求中解析和提取有效负载?
- 如何重用 http::beast::flat_buffer 和 http::response?
- Boost Beast 异步服务器失败,断言失败:(id_ != T::id) 在多个 aync 调用中
- boost beast Websocket Multi Request Server/Client 并不是真正的 mul
- "Body requirements not met"将 req 传递给 c++ 中的方法(Boost Beast 库)
- Websocket 客户端在 C++ 中使用 boost::Beast - 在写入操作时抛出错误
- 断开连接后重新连接boost beast(asio)websocket和http连接时出错
- 为什么Boost Variant使用模板构造函数而不是Boost::beast::websocket::stream的移
- boost beast websocket服务器也接受http连接
- 如何将 boost::beast 的响应<buffer_body>转换为响应<string_body>?
- 我可以使用 Boost.Asio 和 Boost.Beast 库发出 HTTPS 请求或 HTTP/2 请求吗?
- Boost::Beast Websocket Bidirection Stream (C++)
- 如何在 Boost::Beast 上继续使用 websocket?
- Cmake忽略了我所有关于在boost::beast存储库中在哪里找到提升的指令