2016-10-18 21 views
1

私は関数に共有されたVisual C++カールポインタでcURLを使用しています。 setData関数はサーバーに送信されますが、機能はありません。なぜそのような問題がありますか?cURLポストフィールドは特殊な文字でエンコードされています

出典:

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) 
{ 
    ((std::string*)userp)->append((char*)contents, size * nmemb); 

    return size * nmemb; 
} 

void setData(CURL *curl) // bad working (encoded sent fields...) 
{ 
    string fields = "{\"daa\": \"a\"}"; 

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, fields.c_str()); 
} 

void setUrl(CURL* curl) // good working 
{ 
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); 
} 

int main() 
{ 
    CURL *curl; 
    CURLcode res; 
    string readBuffer; 

    curl = curl_easy_init(); 
    struct curl_slist *list = NULL; 

    list = curl_slist_append(list, "Content-Type: application/json"); 

    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); 
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); 

    setUrl(curl); 
    setData(curl); 
    res = curl_easy_perform(curl); 

    cout << readBuffer; 

    getchar(); 

    return 0; 
} 
+1

を所有しているが、ライブラリとしてこれを使用しないでください。しかし、マニュアルページをチェックするだけです。あなたは 'CURLOPT_POSTFIELDS'の代わりに' CURLOPT_COPYPOSTFIELDS 'を試しましたか? – infixed

+0

さらに、このマニュアルでは、CURLOPT_POSTFIELDSIZEセッターが必要になるかもしれません。しかし、それはゼロ終了c_str – infixed

+0

あなたのソリューションが今すぐ動作しようとしたので、多分ではない。ありがとうございました。 –

答えて

0

ここでの問題は、ストレージの所有権の問題です。

CURLOPT_POSTFIELDSを使用する場合は、データストレージがcurlで使用するまで永続的な状態を保つ必要があります。あなたのプログラムでは、文字列はローカル変数なので、問題があります。サブルーチンが終了すると、所有権は消え、他のものはそのメモリを使用することができます。

あなたはカールがストレージにデータをコピーしますので、あなたは、その周りを取得しますバリエーションCURLOPT_COPYPOSTFIELDSを使用している場合、それは

関連する問題