我正在尝试使用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);
注意:上面更改了一些编码数据。
非常感谢任何帮助。
谢谢, ķ
答案 0 :(得分:1)
根据The Manual ...
CURLOPT_READFUNCTION解释
...
如果将此回调指针设置为NULL,或者根本不设置它,则将使用默认的内部读取功能。它正在使用CURLOPT_READDATA对FILE * userdata进行fread()。
但是,您也没有设置CURLOPT_READDATA
。再看看The manual ......
CURLOPT_READDATA解释
...
默认情况下,这是stdin的FILE *。
所以你的节目"挂起"似乎是因为它正在等待某些内容到达标准输入 stdin
。
所以它的工作方式就是这个。
1)如果您 nothing ,发送到服务器的数据来自标准输入(通常是键盘)。< / p>
2)如果您只设置 CURLOPT_READDATA
,那么必须是您打开输入的FILE*
包含您要发送的数据的文件。
3)如果设置CURLOPT_READFUNCTION
,那么CURLOPT_READDATA
可以指向您的功能需要完成向服务器发送数据的任务