2017-07-05 13 views
1

libcurl C++を使用してPOST要求を送信しています。私は理解できなかった正しいものを除いて、ほぼすべての組み合わせを試しました。LibCurlを使用するHTTP POST

curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); /*Not Recommended to use but since certificates are not available this is a workaround added*/ 
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE); /*Not Recommended to use but since certificates are not available this is a workaround added*/ 

curl_easy_setopt(curl, CURLOPT_HTTPPOST, TRUE); //CURLOPT_POST does not work as well 
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sJson); 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, bytesCallback); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); 
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, bytesCallback); 
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headBuffer); 

sJsonpb2jsonによって作成されたボディを持っていstd::stringです。

私はボディが送られない理由を理解できませんか? いくつかのAPIがありますか?libcurlがあれば、私は行方不明です。

+0

本文またはヘッダー? – Asesh

+0

サーバが「本体なしでログイン要求を受信しました」というメッセージで本体が送信されない – CMouse

+0

HTTPPOSTはマルチパートメッセージを送信します。代わりにCURLOPT_POSTが必要です。 – Simple

答えて

2

ここでカスタムリクエストを使用することをお勧めします。CURLOPT_CUSTOMREQUEST以下は、問題なく動作するコードスニペットです。 カスタムリクエストを使用する場合、何も意味するものではなく、明示的に定義する必要があります。CURLOPT_HTTPHEADER

ここでは最小限のコードを使用しています。あなたはそれがc_str()を使用してc type stringとしてsJsonパスを渡し、Cのように(私は何とか最初は逃した)コンテンツの長さを通過する間に+1を使用するように覚えているとき

はまた、文字列は慣例により、で終わり、ちょうどchar配列です。 a NULLバイト。

struct curl_slist* slist = NULL; 
slist = curl_slist_append(slist, "Content-Type: application/json"); 
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); 

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sJson.c_str()); /* data goes here */ 
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, sJson.length() + 1); /* data goes here */ 

EDIT:curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");使用し、リダイレクトで問題を作成し、あなたのユースケースに応じて、それを使用する場合があります。

+1

'CURLOPT_CUSTOMREQUEST、POST")を削除することをお勧めします。後でリダイレクトなどに従うようにしたい場合に頭痛を引き起こします。最初のケースでは何も追加しません。 'CURLOPT_POSTFIELDS'はPOSTを意味します。 –

+0

@DanielStenberg、意味が分かります! –

関連する問題