0

C++ アプリケーションでヘッダー付きの cURL 投稿を作成しました。

CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());               
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &bufferdata);     
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writerResponse);

struct curl_slist *headers=NULL;
char outputmessage[]="";            

headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers );
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, cJSONstring.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, cJSONstring.length());
curl_easy_setopt(curl, CURLOPT_VERBOSE,1);
curl_easy_setopt(curl, CURLOPT_HEADER,1);
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);

curl_multi_add_handle(m_telemetryCurlm, curl);

multi perform を呼び出すスレッドを作成しました。

void ContentManager::processTelemetry()
{
    m_telemetryThreadRunning = true;
    while(m_telemetryThreadRunning)
    {
        static_cast<ADCAnalytics*>(m_adcAnalytics)->performTelemerty();
        usleep(5000); 
    }   
}

void ADCAnalytics::performTelemerty()
{   
    // number of active downloads
    int counter = 0;

    // preform downloading
    curl_multi_perform(m_telemetryCurlm, &counter);     

    // handle CURL actions (connection errors, download finish, etc.)
    checkCURLMessages();    
} 

しかし、カールメッセージを確認すると、次のようになります。

12-10 13:23:00.845: I/ADC (17248): バッファ = HTTP/1.1 400 不正な要求

12-10 13:23:00.845: I/ADC (17248): X-TraceUrl: /appstats/details?time=1355145806563&type=json

12-10 13:23:00.845: I/ADC(17248): コンテンツ タイプ: テキスト/プレーン

12-10 13:23:00.845: I/ADC(17248): 変化: Accept-Encoding

12-10 13:23:00.845: I/ADC(17248): 日付: 2012 年 12 月 10 日月曜日 13:23:26 GMT

12-10 13:23:00.845: I/ADC(17248): サーバー: Google フロントエンド

12-10 13:23:00.845: I/ADC (17248): キャッシュ制御: プライベート

12-10 13:23:00.845: I/ADC(17248): 転送エンコード: チャンク

curl_multi_add_handle と curl_multi_perform で content-type が変わっているようです。ここで何が間違っているのか誰にもわかりませんか?content-type が変更されないようにするにはどうすればよいですか?

以下のコードを追加する場合

         do {
        while(curl_multi_perform(m_telemetryCurlm, &still_running) ==CURLM_CALL_MULTI_PERFORM);                                 
    } while (still_running);                                                             

cURL オブジェクトを設定した直後。リクエストがサーバーに送信され、取得します

12-10 13:11:48.105: I/ADC(16845): バッファ = HTTP/1.1 200 OK

12-10 13:11:48.105: I/ADC (16845): X-TraceUrl: /appstats/details?time=1355145133776&type=json

12-10 13:11:48.105: I/ADC (16845): コンテンツ タイプ: アプリケーション/json

12-10 13:11:48.105: I/ADC(16845): 変化: Accept-Encoding

12-10 13:11:48.105: I/ADC(16845): 日付: 2012 年 12 月 10 日月曜日 13:12:13 GMT

12-10 13:11:48.105: I/ADC(16845): サーバー: Google フロントエンド

12-10 13:11:48.105: I/ADC(16845): キャッシュ制御: プライベート

12-10 13:11:48.105: I/ADC(16845): Transfer-Encoding: chunked
だから、サーバー側で何か問題があるとは思わない。

ありがとう

4

1 に答える 1

0

送信する Content-Type と受信する Content-Type を比較していませんか?

于 2012-12-10T21:35:04.143 に答える