2

Curlpp を使用して、さまざまな Web サービスにリクエストを送信し、データを送受信しています。JSONデータの送受信にしか使用していないため、これまでのところうまくいきました。

現在、Web サービスが zip ファイルをバイナリ形式で返す状況があります。これは、受信したデータが完全ではないという問題に遭遇した場所です。

最初に、オプション WriteStream を使用して ostringstream にデータを書き込むように Curl を設定しましたが、データに null 文字が含まれていたため、データが最初の null 文字で停止したため、これは正しいアプローチではないことがわかりました。

その後、WriteStream を使用する代わりに、コールバック関数で WriteFunction を使用しました。この場合の問題は、データの量に関係なく、この関数が常に 2 回または 3 回呼び出されることです。これにより、ファイルの最初の部分とは思えないデータのチャンクが常にいくつか存在することになりますが、データには常に最初の 2 文字として PK が含まれており、zip ファイルであることを示しています。

いくつかのツールを使用して、データが完全にアプリケーションに送信されていることを確認したので、これは Web サービスの問題ではありません。

ここにコード。ホスト名、ポート、ヘッダー、ポストフィールドなどのオプションが別の場所に設定されていることに注意してください。

string requestData;

size_t WriteStringCallback(char* ptr, size_t size, size_t nmemb)
{
    requestData += ptr;
    int totalSize= size*nmemb;
    return totalSize;
}

const string CurlRequest::Perform()
{
    curlpp::options::WriteFunction wf(WriteStringCallback);
    this->request.setOpt( wf );
    this->request.perform();

    return requestData;
}

これを修正する方法についての手がかりが枯渇したため、またcurlppの文書化が不十分であるため(さらにcurlppのWebサイトが消えてからさらに悪いことに)、誰かがこの問題について私を助けてくれることを願っています.

4

2 に答える 2

2

コードの問題は、データがバイナリ(ZIP)形式であるにもかかわらず、データがstd::stringに入れられることです。データをストリーム(またはバイナリ配列)に入れることをお勧めします。コールバックを登録して応答ヘッダーを取得し、に従ってWriteCallbackで動作することもできます"Content-type"

curlpp::options::HeaderFunction応答ヘッダーを取得するためのコールバックを登録します。

于 2012-11-12T23:39:09.687 に答える
1

std::stringは問題ありませんが、連結は次のとおりです。

requestData += ptr;

C 文字列 (ptr) はゼロで終了します。入力にゼロ バイトが含まれている場合、入力は切り捨てられます。データの長さを知っている文字列にラップする必要があります。

requestData += std::string(ptr, size*nmemb);
于 2014-07-25T07:04:27.927 に答える