繁体   English   中英

如何在不使用文件指针的情况下在libcurl中发送长PUT数据?

[英]How do I send long PUT data in libcurl without using file pointers?

我正在尝试与Google Contact API进行交互,为了更新远程端的联系人,我需要使用PUT请求而不是POST。

由于我想要PUT的数据已经在内存中,我真的不想处理文件指针,这似乎是CURLOPT_READDATA的默认行为。 因此,我知道除此之外我还需要使用CURLOPT_READFUNCTION,但我无法理解逻辑。

以下是相关文档: http//curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTREADFUNCTION

打印传入的变量,我看到nmemb=16372size=1 例如,如果我的数据大小为100K,那么我需要实现的逻辑是什么?

谢谢。

您仍然希望使用CURLOPT_READDATA ,但是如果使用CURLOPT_READFUNCTION ,它可以是任何用户指定的指针。 您可以创建一个简单的结构,如:

struct put_data
{
  char *data;
  size_t len;
};

其中data是PUT数据, 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;

这基本上计算出复制,复制,然后更新长度和指针的数量。 to_copy行,我们计算最小值,因为它们受剩余量和curl缓冲区大小的限制。 最后,我们返回curl要求复制的字节数。 当你在内容结束时user_data->len (因此to_copy )将为0.什么都不会被复制,返回0结束传输。

这是正确的方法。

要记住的另一件事是你必须设置文件大小:

curl_easy_setopt(curlHandle, CURLOPT_INFILESIZE,(curl_off_t)putData.size);

否则,您的服务器可能会抛出错误,指出未指定请求长度。

putData是put_data结构的一个实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM