Повысить зверь HTTP - PullRequest
       24

Повысить зверь HTTP

0 голосов
/ 23 мая 2018

Я работаю над парсером http, и похоже, что boost.beast хорош.Однако у меня все еще есть некоторые вопросы:

*** Предположим, что данные HTTP-запроса POST уже получены через сокет boost.asio.Хранится в буфере std :: string.

  1. Есть ли хороший пример того, как извлечь поля заголовка http и его значение (одно за другим)?Я предполагаю, что это будет метод итератора, но я пробовал несколько способов и все еще не будет работать.

  2. Как извлечь тело http?

Большое спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

Начиная с простого примера: 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;

Extract The Body

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";
все становится более простым.
...