2014-09-06 5 views
1

Беседу с API Лиги Легенд.Ответ JSON разделен на несколько обратных вызовов cURL

У меня была проблема на пару дней, поэтому я упростил то, что происходит. Я отправляю URL через cURL, который должен вернуть блок Json. URL-адрес открывается в моем браузере и отображает ожидаемые данные. Однако по какой-то странной причине cURL (или API?) Несколько раз отправляет данные моей функции обратного вызова.

Несколько фрагментов того, что возвращает:

начинается с - { "20278403": [{ "Имя": "Поп ...

концы с - {" имя ":" Оверлордов Karthus в» «ти

Буквально вырезает с„ти новый обратный вызов, то начинается, продолжая со старыми данными:

начинается с - э.“:» PLATINUM «» дие ...

Ends with - "isInact ive ": false}]}]}

Как вы можете заметить, правильное завершение для Json присутствует с выходом второго обратного вызова. Я знаю, что предложение будет «почему бы просто не засунуть все это в одну строку и разобрать его после?» - проблема в том, что мне нужно отправить несколько запросов, поскольку вы можете запросить только X данных игроков за раз. Поэтому трудно сказать, где начинается Json Json, а другой заканчивается!

Самое главное - кто-нибудь знает, почему это происходит? Кажется крайне странным возвращать данные по нескольким обратным вызовам.

Если это помогает .. только общий Curl вызов:

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^