web-dev-qa-db-ja.com

C ++ Boost.asioおよびBeastライブラリを使用してデータを本文で送信する

当社のREST-Webサービスにデータを送信するためにC++ライブラリを使用する必要があります。私はBoostと Beast から始め、Ubuntu16.04環境のCode :: Blocksの下に here という例を示します。ドキュメントは、次の問題で私を助けませんでした:

私のコードは多かれ少なかれ例と同じであり、GETリクエストをコンパイルしてテストWebサービスに正常に送信できます。

しかし、この定義からリクエスト(req)内にデータを設定するにはどうすればよいですか?

:
beast::http::request<beast::http::string_body> req;
req.method("GET");
req.target("/");
:

req.body.???を使用しようとしましたが、コードを完了しても機能についてのヒントが得られません(ところで、機能しません)。データを送信するには、req.methodを「POST」に変更する必要があることを知っています。

Googleはこれに関する新しい例を示していません。例として、上記のコードのみが見つかります。

コード例のヒントを持っている人、または獣について使用している人(roar)。または、WebSocketを使用する必要がありますか?または単にboost :: asioのように答えた ここ

事前に感謝し、私の悪い英語を許します。

9
Banzai

リクエストとともにデータを送信するには、本文に入力してコンテンツタイプを指定する必要があります。

beast::http::request<beast::http::string_body> req;
req.method(beast::http::verb::post);
req.target("/");

「key = value」を「x-www-form-urlencoded」ペアとして送信する場合:

req.set(beast::http::field::content_type, "application/x-www-form-urlencoded");
req.body() = "name=foo";

または生データ:

req.set(beast::http::field::content_type, "text/plain");
req.body() = "Some raw data";
10
Eliott Paris

エリオットパリの答えへの小さな追加:

  1. 本文を設定するための正しい構文は

    req.body() = "name=foo";
    
  2. 追加する必要があります

    req.prepare_payload();
    

    hTTPヘッダーで本体サイズを設定するように本体を設定した後。

9
jahr