2016-03-30 12 views
0

は、私は、URLからJSONデータを取得しようとしています:私は、データがそのURLから返さ取得したいlibcurl HTTP webrequestを作成するには?

sub.domain.com/rest/getdiscounts?supermarketid=5323 

。ターミナルでは、私はこのようにそれを行うことができます。私のような、これまでに複数のものを試してみました

curl --user user:password "http://sub.domain.com/rest/getdiscounts?supermarketid=5323" 

static string lastResponse; 

size_t server_response_stream(void *ptr, size_t size, size_t nmemb, void *) 
{ 
    lastResponse += (const char*)ptr; 
    return size * nmemb; 
} 

bool get_request(string data1, string& errorDescription) 
{ 
    CURL *curl = curl_easy_init(); 
    if (curl == NULL) 
    { 
    errorDescription = "Unable to initialise Curl"; 
    cout << errorDescription << std::endl; 
    return false; 
    } 
    const string url = "http://sub.domain.com/rest/"; 
    curl_easy_setopt(curl, CURLOPT_URL, (url + "getdiscounts").c_str()); 
    curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_easy_setopt(curl, CURLOPT_USERPWD, USPA); 

    char* dc1 = curl_easy_escape(curl, data1.c_str(), 0); 
    string arg = "supermarketid=" + (string)dc1; 
    const char* dt = arg.c_str(); 

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, dt); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(dt)); 

    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 

    lastResponse = ""; 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, server_response_stream); 

    CURLcode res = curl_easy_perform(curl); 

    res = curl_easy_perform(curl); 

    if (res != CURLE_OK) 
    { 
    errorDescription = "Curl call to server failed!"; 
    cout << errorDescription << std::endl; 
    return false; 
    } 

    curl_easy_cleanup(curl); 
    return true; 
} 

私はソースthis questionthis linkとして使用します。

編集:ありがとうございました!私は再びゼロから開始し、それが今取り組んでいる:

static string responseStr; 
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *) 
{ 
    responseStr = (const char*)ptr; 
    return size * nmemb; 
} 

string get_request() 
{ 
    CURL *curl; 
    CURLcode res; 

    curl = curl_easy_init(); 
    if (curl) 
    { 
    curl_easy_setopt(curl, CURLOPT_URL, "http://sub.domain.com/rest/getdiscounts?supermarketid=5323"); 
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 
    curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_easy_setopt(curl, CURLOPT_USERPWD, CREDENTIALS); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); 

    res = curl_easy_perform(curl); 

    if (res != CURLE_OK) 
    { 
     cout << "curl_easy_perform() failed!" << std::endl; 
     curl_easy_strerror(res); 
     curl_easy_cleanup(curl); 
     return ""; 
    } 

    else if (res == CURLE_OK) 
    { 
     curl_easy_cleanup(curl); 
     return responseStr; 
    } 
    } 
} 
+0

なぜ2回演奏していますか? – 2501

+0

@ 2501作業を行うために第2の呼び出しを認証するための第1の呼び出し。 – Zero

+0

'curl --user user:password" http://sub.domain.com/rest/getdiscounts?supermarketid=5323 "' POSTリクエストを作成するときにGETリクエストのように見えますが、それは奇妙ではありませんか? – nodakai

答えて

0

CURLOPT_WRITEFUNCTION callback機能server_response_streamの最初の引数ptr、受信したデータを指します。そのデータはヌル終了されません。

文字列+=operatorは、NULL終了文字列へのポインタを受け取る必要があります。

lastResponse += (const char*)ptr;コールは未定義の動作を引き起こしています。バイトは文字列に別の方法で追加する必要があります。文字列で文字を追加するには、引数sizenmembを使用してバッファのサイズを決定します。

+0

これはなぜ必要なのですか?\ – Zero

+0

@Zeroどういう意味なのでしょうか?どの部分がはっきりしていないのですか?私は答えの問題を説明しました。 – 2501

+0

lastResponseを直接設定すると、何が定義されていない動作を引き起こしているのですか? – Zero

関連する問題