Boost Beast HTTP

Jim*_*mmy 7 boost visual-c++ c++11 boost-beast

我正在开发一个http解析器,看起来像boost.beast是一个很好的.但是,我还有一些问题:

***假设已通过boost.asio套接字接收到HTTP请求POST数据.存储在std :: string缓冲区中.

  1. 有没有关于如何提取http标头字段及其值(一个接一个)的好样本?我假设它将是一个迭代器方法,但我尝试了几种方法仍然无法工作.

  2. 如何提取http正文?

非常感谢你.

seh*_*ehe 7

从一个简单的例子开始: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);
Run Code Online (Sandbox Code Playgroud)

提取标题

响应对象已包含所有商品:

for(auto const& field : res)
    std::cout << field.name() << " = " << field.value() << "\n";

std::cout << "Server: " << res[http::field::server] << "\n";
Run Code Online (Sandbox Code Playgroud)

您还可以只流式传输整个响应对象:

std::cout << res << std::endl;
Run Code Online (Sandbox Code Playgroud)

提取身体

std::cout << "Body size is " << res.body().size() << "\n";
Run Code Online (Sandbox Code Playgroud)

要实际使用"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";
Run Code Online (Sandbox Code Playgroud)

或者,请参阅 beast::buffers_to_string

显然,使用以下内容时事情变得更加直截了当string_body:

std::cout << "Body: " << std::quoted(res.body()) << "\n";
Run Code Online (Sandbox Code Playgroud)