【问题标题】:Boost Beast HTTP增强野兽 HTTP
【发布时间】:2018-11-01 21:56:24
【问题描述】:

我正在开发一个 http 解析器,看起来 boost.beast 是一个不错的解析器。不过,我还有一些问题:

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

  1. 有没有关于如何提取 http 标头字段及其值(一个接一个)的好示例?我认为这将是一个迭代器方法,但我尝试了几种方法仍然无法正常工作。

  2. 如何提取http body?

非常感谢。

【问题讨论】:

    标签: c++11 visual-c++ boost boost-beast


    【解决方案1】:

    从一个简单的例子开始: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

    显然,使用string_body 时事情变得更加直接:

    std::cout << "Body: " << std::quoted(res.body()) << "\n";
    

    【讨论】:

    • 我不知道std::quoted!输出的替代方法是使用std::cout &lt;&lt; beast::buffers(res.body().data()) &lt;&lt; "\n";std::ostream&amp;。函数beast::buffers 将缓冲区序列调整为与operator&lt;&lt; 一起使用的东西。
    • @VinnieFalco 每天在这里学习。我真的很喜欢你评论这些事情。干杯!
    • 只打印标题:std::cout &lt;&lt; res.base();
    • @VinnieFalco +1 在这种情况下,我们试图专门解决“如何提取 http 标头字段及其值(一个接一个)?”的问题
    • 也许basic_fields::value_type 应该有一个operator&lt;&lt;。我会打开一个问题。见:github.com/boostorg/beast/issues/1143
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多