2014-09-06 72 views
1

與傳奇聯盟API混戰。JSON響應分成多個cURL回調

我已經有一個問題了幾天,所以我簡化了發生了什麼事情。我通過cURL發送一個URL,它應該返回一個Json塊。 URL在我的瀏覽器中打開並顯示預期的數據。然而,出於某種奇怪的原因,cURL(或API?)多次向我的回調函數發送數據。

什麼返回一些片段:

開頭 - { 「20278403」: - 「:」 卡爾薩斯的霸主」:[{ 「名」 名 「{流行...

大詞典」 「TI

字面上削減了與‘TI然後,新的回調開始,在繼續使用舊數據:

始於 - 嗯。’」白金「」闕......

結束 - 「isInact ive「:false}]}]}

您可能注意到,Json的正確終止與第二個回調的輸出一起出現。我知道這個建議是'爲什麼不把它全部放到一個字符串中並解析它呢?' - 問題是我需要發送幾個請求,因爲您一次只能請求X個玩家數據。所以很難說出一個請求的Json開始和另一個結束!

最重要的是 - 有人知道爲什麼會發生這種情況嗎?跨多個回調返回數據似乎非常奇怪。

如果有幫助..只是一個普通的捲曲電話:

curl_easy_setopt(m_pCurl, CURLOPT_URL, "https://euw...") 
curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, &DataSuccessCB); 
curl_easy_perform(m_pCurl); 

size_t CAPIReader::DataSuccessCB(char* cBuffer, size_t iSize, size_t nmemb, void* userData) 
{ 
    string sBuffer = string(cBuffer); 
    vStrVec.push_back(sBuffer); // vector holding all the returned json strings - intended to have a whole block of json in each one! 
    return (iSize * nmemb); 
} 

感謝。

回答

0

這是libcurl的正常行爲,您可以在getinmemory.c示例中看到這一點。我想,當數據從套接字可用時,cURL回調函數。所以如果TCP消息是分段的,回調會被多次調用。

一種可能的解決方案來連接所述消息是對指針發送到字符串來填充:

size_t CAPIReader::DataSuccessCB(char* cBuffer, size_t iSize, size_t nmemb, void* userData) 
{ 
    std::string & buffer = *(std::string*)userData; 
    buffer.append((char*)contents,nmemb*iSize); 
    return (iSize * nmemb); 
} 

std::string data; 
curl_easy_setopt(m_pCurl, CURLOPT_URL, "https://euw...") 
curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, &DataSuccessCB); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&data); 
if(curl_easy_perform(m_pCurl) == CURLE_OK) 
{ 
    // Parse the JSON data in data string 
}