gpt4 book ai didi

c++ - 助推野兽 : how to produce non-chunked response with a custom body when a content length is not readily available?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:55 27 4
gpt4 key购买 nike

我正在尝试实现一个自定义主体类型,该主体类型将包含一个已解析的 JSON 树对象。这个任务看起来很自然,但我找不到使用 Beast 生成携带 JSON 的非分块 HTTP 消息的方法。我有一个通过包装 libmicrohttpd 和 libcurl 实现的 REST 客户端/服务器,但我更愿意改用 Boost Beast。

据我所知,问题是正文类型的 size(value_type const&) 方法接收到对要序列化的正文值的引用(在我的例子中是一个 JSON 树对象),但是如果不实际将其字符串化,则无法确定字符串化 JSON 的确切长度。但是,如果我删除 size() 方法,Beast 会认为我要求的是分块传输编码。当然,分块编码本身并没有什么问题,但对我来说,这可能意味着修复一些自动化和监控脚本,更不用说集成测试了。

我想做的是为我正在准备的消息分配一个 JSON 对象,然后 Beast 询问writer,而不是 body::size() 有效负载大小。这对我来说似乎是合乎逻辑的,因为实际的 HTTP 消息正文(序列化的 JSON)与内存中的实时 JSON 对象完全不同,并且是 body::writer 生成用于传输的正文字节。我错了吗?

无论如何,你认为有好的方法来解决这个问题吗?

提前感谢您的时间和精力!

问候,弗拉德

最佳答案

感谢您的美言,我很高兴看到 body 定制系统受到关注!你在问题中写的大部分内容都是正确的。如果您希望 Beast 在您调用 message::prepare_payload 时设置 Content-Length 字段,那么您必须在 Body::size 中提供正确的实现。 BodyWriter 直到序列化时才创建。这个问题最自然的解决方案是避免提供 Body::size 并让 Beast 在序列化您的主体类型时使用分块传输编码。我还应该注意,当您序列化 JSON 时,最好在编写器中一次执行一点而不是将整个内容转换为字符串。这就是拥有 writer 对象的目的,以保持中间状态并允许增量序列化。否则,您必须为整个序列化表示分配内存,效率较低。

更新:

body::size()message::prepare_payload 并非旨在按照您希望的方式使用。如果我明白你想做什么,那么这个函数应该处理它:

/** Prepare a message with a JSON payload.

This function accepts ownership of a message with a JSON body
and converts the JSON to string, returning a new message with
a string body. The Content-Length field is set on the new
message. All other fields are transferred over unmodified.
*/
template<
bool isRequest,
class Allocator>
message<
isRequest,
string_body,
basic_fields<Allocator>>
prepare(
message<
isRequest,
json_body,
basic_fields<Allocator>>&& m)
{
message<
isRequest,
string_body,
basic_fields<Allocator>> result{
std::move(m.base()),
json_to_string(m.body())};
result.prepare_payload();
return result;
}

关于c++ - 助推野兽 : how to produce non-chunked response with a custom body when a content length is not readily available?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48150818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com