乱搞英雄联盟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);
}
感谢。
答案 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
}