1

玩弄英雄联盟 API。

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

返回的一些片段:

以 - {"20278403":[{"name":"Pop...

以 - {"name":"Karthus's Overlords","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);
}

谢谢。

4

1 回答 1

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
}
于 2014-10-24T20:49:31.593 回答