web-dev-qa-db-ja.com

ブーストビーストHTTP

私はhttpパーサーに取り組んでいますが、boost.beastは素晴らしいもののようです。しかし、私はまだいくつかの質問があります:

*** HTTPリクエストPOSTデータはboost.asioソケットを介してすでに受信されていると想定します。std:: stringバッファ内に保存されます。

  1. Httpヘッダーフィールドとその値を(次々に)抽出する方法に関する良いサンプルはありますか?イテレータメソッドになると思いますが、いくつかの方法を試しましたが、それでも機能しません。

  2. Http本文を抽出する方法は?

どうもありがとうございました。

7
Jimmy

簡単な例から始めます: 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";
7
sehe