![](/img/trans.png)
[英]libcurl POST - CURLOPT_READFUNCTION & CURLOPT_WRITEFUNCTION for posting XML
[英]libcurl: curl_easy_perform blocks unless CURLOPT_READFUNCTION is set
我正在尝试使用libcurl C ++进行REST / HTTP请求。 我注意到curl_easy_perform块,但是如果我设置CURLOPT_READFUNCTION则不会。 我只是想了解为什么,我是libcurl或HTTP / REST协议的新手。
这是代码:
m_pCurl = curl_easy_init();
curl_easy_setopt(m_pCurl, CURLOPT_URL, "https://blahblahblah/api/auth/user/login");
curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(m_pCurl, CURLOPT_POST, 1);
curl_easy_setopt(m_pCurl, CURLOPT_COOKIE, "SKEY=BLAHBLAHBLAH");
struct curl_slist *list = NULL;
list = curl_slist_append(list, "Accept: application/json");
list = curl_slist_append(list, "Connection: keep-alive");
list = curl_slist_append(list, "Expect:");
list = curl_slist_append(list, "Content-Type: application/json");
list = curl_slist_append(list, "x-website-parameters: LALALALA");
curl_easy_setopt(m_pCurl, CURLOPT_HTTPHEADER, list);
// Callbacks
readarg_t rarg;
// readcb is a callback function
// Removing the two lines below will cause curl_easy_perform to hang
curl_easy_setopt(m_pCurl, CURLOPT_READFUNCTION, readcb);
curl_easy_setopt(m_pCurl, CURLOPT_READDATA, &rarg);
CURLcode res = curl_easy_perform(m_pCurl);
注意:某些编码数据已在上面更改。
任何帮助将不胜感激。
谢谢,K
根据手册 ...
CURLOPT_READFUNCTION解释
...
如果将此回调指针设置为NULL,或者根本不设置,则将使用默认的内部读取功能。 它正在使用CURLOPT_READDATA设置的FILE *用户数据上执行fread()。
但是,您也没有设置CURLOPT_READDATA
。 因此,再次查看《手册》 ...
CURLOPT_READDATA说明
...
默认情况下,这是stdin的FILE *。
因此,您的程序“挂起”的原因似乎是因为它正在等待标准输入 stdin
上的内容到达。
因此,它的工作方式应该是这样。
1)如果您什么也不做,则发送到服务器的数据来自标准输入 (通常是键盘)。
2)如果仅 CURLOPT_READDATA
则它必须是您打开到包含要发送的数据的输入文件的FILE*
。
3)如果设置了CURLOPT_READFUNCTION
则CURLOPT_READDATA
可以指向您的函数完成其向服务器发送数据的任务所需的任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.