![](/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.