2014-09-06 1 views
1

리그 오브 레전드 API를 사용하고 있습니다.JSON 응답이 여러 cURL 콜백으로 분할되었습니다.

나는 며칠 동안 문제를 겪었으므로 지금 진행중인 작업을 간소화했습니다. 나는 CURL을 통해 URL을 보내고 있는데, 이는 Json 블록을 반환해야합니다. URL이 내 브라우저에서 제대로 열리고 예상 데이터가 표시됩니다. 그러나 몇 가지 이상한 이유로, cURL (또는 API?) 콜백 함수에 데이터를 여러 번 보내고 있습니다. 반환 무엇

몇 조각 :

시작과 함께 - { "20278403"- ":"Karthus의 오버로드 ": [{"이름 "이름"{팝 ...

과 함께 종료 " ., TI "TI는

그대로 밖으로 잘라"새로운 콜백은 이전 데이터에 계속 시작 :

시작과 함께 - 어 ":"... 가야 ","PLATINUM

끝으로 - "isInact ive ": false}]}]}

두 번째 콜백 출력과 함께 Json에 대한 올바른 종료가 있습니다. 제안은 '모든 문자열을 하나의 문자열로 엮어서 구문 분석하지 않는 이유는 무엇입니까?'라는 것을 알고 있습니다. - 한 번에 여러 명의 플레이어에게만 데이터를 요청할 수 있기 때문에 몇 가지 요청을 보냅니다. 그래서 한 요청의 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 
}