首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost Beast HTTP

Boost Beast HTTP
EN

Stack Overflow用户
提问于 2018-05-23 03:33:18
回答 1查看 7.2K关注 0票数 7

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

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

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

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2018-05-23 22:46:54

从一个简单的例子开始:sync.cpp

代码语言:javascript
复制
    // Declare a container to hold the response
    http::response<http::dynamic_body> res;

    // Receive the HTTP response
    http::read(socket, buffer, res);

提取标头

response对象已经包含了所有商品:

代码语言:javascript
复制
for(auto const& field : res)
    std::cout << field.name() << " = " << field.value() << "\n";

std::cout << "Server: " << res[http::field::server] << "\n";

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

代码语言:javascript
复制
std::cout << res << std::endl;

拔出身体

代码语言:javascript
复制
std::cout << "Body size is " << res.body().size() << "\n";

要实际使用"dynamic_body",请使用标准的Asio缓冲区操作:

代码语言:javascript
复制
#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时,事情变得更加直截了当。

代码语言:javascript
复制
std::cout << "Body: " << std::quoted(res.body()) << "\n";
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50479407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档