Art*_*kii 4 c++ post curl http libcurl
我正在尝试与Google Contact API进行交互,为了更新远程端的联系人,我需要使用PUT请求而不是POST.
由于我想要PUT的数据已经在内存中,我真的不想处理文件指针,这似乎是CURLOPT_READDATA的默认行为.因此,我知道除此之外我还需要使用CURLOPT_READFUNCTION,但我无法理解逻辑.
以下是相关文档:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTREADFUNCTION
打印传入的变量,我看到nmemb=16372和size=1.例如,如果我的数据大小为100K,那么我需要实现的逻辑是什么?
谢谢.
您仍然希望使用CURLOPT_READDATA,但是如果您使用CURLOPT_READFUNCTION,它可以是任何用户指定的指针.您可以创建一个简单的结构,如:
struct put_data
{
char *data;
size_t len;
};
Run Code Online (Sandbox Code Playgroud)
dataPUT数据在哪里,len是长度(剩余).
然后,设置CURLOPT_READDATA为指向该结构的初始化实例的指针.您将在传递它CURLOPT_READFUNCTION作为userdata.在该功能中,执行以下操作:
size_t curl_size = nmemb * size;
size_t to_copy = (userdata->len < curl_size) ? userdata->len : curl_size;
memcpy(ptr, userdata->data, to_copy);
userdata->len -= to_copy;
userdata->data += to_copy;
return to_copy;
Run Code Online (Sandbox Code Playgroud)
这基本上计算出复制,复制,然后更新长度和指针的数量.在to_copy行,我们计算最小,因为是被两个剩余量和卷曲的缓冲区的大小的限制.最后,我们返回curl要求复制的字节数.当你在内容的末尾user_data->len(因此to_copy)将是0.没有任何东西将被复制,返回0结束传输.
| 归档时间: |
|
| 查看次数: |
5846 次 |
| 最近记录: |