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.Asio SSL 请求返回 405 Not Allowed?
boost asio tcp socket 1.70 不向后兼容