我正在开发一个 http 解析器,看起来 boost.beast 是一个不错的解析器。但是,我仍然有一些问题:
*** 假设已经通过 boost.asio 套接字接收到 HTTP 请求 POST 数据。存储在 std::string 缓冲区中。
有没有关于如何提取 http 标头字段及其值(一个接一个)的好示例?我认为这将是一个迭代器方法,但我尝试了几种方法,但仍然无法正常工作。
如何提取http正文?
非常感谢。
我正在开发一个 http 解析器,看起来 boost.beast 是一个不错的解析器。但是,我仍然有一些问题:
*** 假设已经通过 boost.asio 套接字接收到 HTTP 请求 POST 数据。存储在 std::string 缓冲区中。
有没有关于如何提取 http 标头字段及其值(一个接一个)的好示例?我认为这将是一个迭代器方法,但我尝试了几种方法,但仍然无法正常工作。
如何提取http正文?
非常感谢。
从一个简单的例子开始:https ://www.boost.org/doc/libs/develop/libs/beast/example/http/client/sync/http_client_sync.cpp
// Declare a container to hold the response
http::response<http::dynamic_body> res;
// Receive the HTTP response
http::read(socket, buffer, res);
响应对象已经包含所有商品:
for(auto const& field : res)
std::cout << field.name() << " = " << field.value() << "\n";
std::cout << "Server: " << res[http::field::server] << "\n";
您也可以只流式传输整个响应对象:
std::cout << res << std::endl;
std::cout << "Body size is " << res.body().size() << "\n";
要实际使用“dynamic_body”,请使用标准 Asio 缓冲区操作:
#include <boost/asio/buffers_iterator.hpp>
#include <boost/asio/buffers_iterator.hpp>
std::string body { boost::asio::buffers_begin(res.body().data()),
boost::asio::buffers_end(res.body().data()) };
std::cout << "Body: " << std::quoted(body) << "\n";
或者,请参阅
beast::buffers_to_string
显然,使用 a 时事情变得更加简单string_body
:
std::cout << "Body: " << std::quoted(res.body()) << "\n";