【问题标题】:JSON response split up over multiple cURL callbacksJSON 响应拆分为多个 cURL 回调
【发布时间】:2014-10-31 08:13:36
【问题描述】:

玩弄英雄联盟 API。

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

返回的一些sn-ps:

开头 - {"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);
}

谢谢。

【问题讨论】:

    标签: c++ json curl jsoncpp


    【解决方案1】:

    这是 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多