12

C で libcurl を使用して、JSON リクエスト本文で PUT リクエストを定義しています。

これは私がやっている方法です:

    sprintf(jsonObj, "\"name\" : \"%s\", \"age\" : \"%s\"", name, age);

    struct curl_slist *headers = NULL;
    curl_slist_append(headers, "Accept: application/json");
    curl_slist_append(headers, "Content-Type: application/json");
    curl_slist_append(headers, "charset: utf-8");

    curl_easy_setopt(curl, CURLOPT_URL, url);

    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcrp/0.1");

    res = curl_easy_perform(curl);

リクエストボディは次のように届きます。

    { '"name" : "Pedro", "age" : "22"' }

{ '最初と最後' }に。

- - より詳しい情報 - - -

このコードを宣言すると

    char* jsonObj = "{ \"name\" : \"Pedro\" , \"age\" : \"22\" }"; 

    struct curl_slist *headers = NULL;
    curl_slist_append(headers, "Accept: application/json");
    curl_slist_append(headers, "Content-Type: application/json");
    curl_slist_append(headers, "charset: utf-8");

    curl_easy_setopt(curl, CURLOPT_URL, url);

    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcrp/0.1");

    res = curl_easy_perform(curl);

サーバーはこれをリクエスト本文として受け取ります。

{ '{ "name" : "Pedro" , "age" : "22" }': '' }

私の質問は:

libCurl のプレフォーマット/エンコーディングは自動的に Json リクエストですか?

ところで、libCurl には JSON オブジェクトをエンコードする何らかの方法がありますか?

本当にありがとう!

4

7 に答える 7

3

libcurl は、送信するように要求したバイトを正確に送信します。JSON の知識はまったくありません。

より良い詳細については、@Lukasaの優れたより精巧な回答を参照してください。

于 2012-08-15T17:40:48.133 に答える
1

システムが正しく動作しているかどうかを理解するための重要な部分は、プログラムが実際にネットワーク経由で送信しているものを確認することです。したがって、バイト ストリームを確認する別の方法として、サーバーを指す (および/または Wireshark を実行する) 代わりに、テスト マシンの別のウィンドウでnetcatインスタンスを実行するだけです。

nc -l 8080

コード (CURLOPT_URL) を「http://localhost:8080」に向けます。

curl が完了するように接続を終了するControl-Dには、ウィンドウをヒットする必要がありますが、事前にテスト リターン テキストを入力することもできます。nc

于 2017-07-07T12:28:10.307 に答える