libcurl 坑之 CURLOPT_WRITEFUNCTION

参考blog:

https://blog.csdn.net/szchtx/article/details/21740599

 如果服务器返回的数据比较长,那么坑会多次调用这个callback,那么我们可以在序列化的时候判断是不是完整的数据,如果序列化失败那么说明是部分数据,需要拼接如下:

size_t QWidgetDemo::onLoginCallBack(char* dest, size_t size, size_t nmemb, void* userp)
{
  json_error_t error;
  static std::string realJsonData = std::string();//拼接真正的数据如果需要拼接的话
  size_t real_size = nmemb * size;

  char* szStr = (char*)malloc(( real_size + 1) * sizeof(char));

 

  if (!szStr)
    return real_size;

  memcpy(szStr, dest, real_size);

  std::string tempStr = std::string();
  szStr[real_size] = '\0';
  tempStr = realJsonData + szStr;

  tempStr = UTF8_To_string(tempStr);
  json_t* root = json_loads(szStr, 0, &error);

 

  if (!root) {
    std::cout << "load json fail: " << error.text << std::endl;
    realJsonData = realJsonData + szStr;

    free(szStr);
    return size * nmemb;
  }
  else
  {
    realJsonData = std::string();
  }
  free(szStr);

  //

  // dosomething

  //

}

 CURLOPT_WRITEFUNCTION 回调回来的数据始终是不规则的json。

服务器返回的是utf-8,使用win32接口utf-8 To ansi (MS官网手册就有)

                                    使用c++11(下面附上)

#include <locale>
#include <codecvt>


int strTowstr(std::wstring& ws, const std::string& s)
{
  std::wstring wsTmp(s.begin(), s.end());

  ws = wsTmp;

  return 0;
}

std::string utf8_encode(const std::wstring& source)
{
  return std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(source);
}

std::wstring utf8_decode(const std::string& source)
{
  return std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(source);
}

两者转换接口一样,此时看了上面老哥的的说法,我验证了一下可能我取的方法有问题,直接拷贝一份,并且附上结束符就解决了

错误的数据: json 0尾部多了个0导致不能正常序列化反序列化

通过拷贝出来自己附上结束符: json并且能正常的序列化,反序列化

 

posted on 2023-02-16 17:14  流若浅  阅读(1133)  评论(0编辑  收藏  举报

导航