JSON响应分解为多个cURL回调

时间:2014-09-06 15:19:44

标签: c++ json curl jsoncpp

乱搞英雄联盟API。

我已经有几天的问题所以我简化了正在发生的事情。我通过cURL发送一个URL,它应该返回一个Json块。 URL在我的浏览器中打开并显示预期的数据。但是由于一些奇怪的原因,cURL(或API?)多次向我的回调函数发送数据。

回报的几个片段:

以 - {“20278403”开头:[{“name”:“Pop ...

结束 - {“名字”:“Karthus的宿主”,“ti

从字面上删除“ti。然后开始新的回调,继续使用旧数据:

以 - er“:”PLATINUM“,”que ...

开头

结束 - “isInactive”:false}]}]}

正如您可能注意到的那样,Json的正确终止与第二个回调的输出一起出现。我知道这个建议将是“为什么不把它全部塞进一个字符串并在之后解析呢?” - 问题是我需要发送几个请求,因为你一次只能请求X个玩家的数据。因此,很难分辨出一个请求的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);
}

感谢。

1 个答案:

答案 0 :(得分: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
}