C++ 使用 Boost.asio 和 Beast 库在正文中发送数据

Posted

技术标签:

【中文标题】C++ 使用 Boost.asio 和 Beast 库在正文中发送数据【英文标题】:C++ Send data in body with Boost.asio and Beast library 【发布时间】:2017-06-02 14:25:06 【问题描述】:

我必须使用 C++ 库将数据发送到我们公司的 REST-Web 服务。 我从 Boost 和 Beast 开始,并在 Ubuntu 16.04 环境中的 Code::Blocks 下给出了 here 的示例。 该文档没有帮助我解决以下问题:

我的代码或多或少与示例相同,我可以成功编译并向我的测试网络服务发送 GET 请求。

但是我怎样才能在这个定义的请求(req)中设置数据:

:
beast::http::request<beast::http::string_body> req;
req.method("GET");
req.target("/");
:

我尝试使用一些req.body.???,但代码完成并没有给我关于功能的提示(顺便说一句。不工作)。我知道req.method必须改为“POST”才能发送数据。

谷歌没有给出新的例子,只找到了上面的代码作为例子。

有人提示代码示例或使用关于野兽 (roar)。或者我应该使用 websockets 吗?还是只 boost::asio 喜欢回答 here?

提前谢谢,原谅我的英语不好。

【问题讨论】:

【参考方案1】:

对 Eliott Paris 的回答的小补充:

    设置正文的正确语法是

    req.body() = "name=foo";
    

    你应该添加

    req.prepare_payload();
    

    设置正文后在 HTTP 标头中设置正文大小。

【讨论】:

请让我知道如何在使用 ostringstream 发送(写入套接字)之前打印有效负载,以及我们是否需要在每行末尾添加 \r\n 我们如何在 boost asio 中执行http 调用?【参考方案2】:

要随请求发送数据,您需要填写正文并指定内容类型。

beast::http::request<beast::http::string_body> req;
req.method(beast::http::verb::post);
req.target("/");

如果您想将“key=value”作为“x-www-form-urlencoded”对发送:

req.set(beast::http::field::content_type, "application/x-www-form-urlencoded");
req.body() = "name=foo";

或原始数据:

req.set(beast::http::field::content_type, "text/plain");
req.body() = "Some raw data";

【讨论】:

以上是关于C++ 使用 Boost.asio 和 Beast 库在正文中发送数据的主要内容,如果未能解决你的问题,请参考以下文章

Boost Beast服务器响应延迟1秒

为啥 Boost.Asio SSL 请求返​​回 405 Not Allowed?

boost asio tcp socket 1.70 不向后兼容

C++ Boost ASIO:如何读取/写入超时?

使用 C++ 和 Boost::Asio 的 N 方客户端到客户端通信

C++——boost:asio的使用