c++ - libcurl:curl_easy_perform block ,除非设置了 CURLOPT_READFUNCTION

标签 c++ rest http libcurl

我正在尝试使用 libcurl C++ 发出 REST/HTTP 请求。我注意到 curl_easy_perform block ,但如果我设置 CURLOPT_READFUNCTION 它不会。我只是想了解为什么会这样,我是 libcurl 或 HTTP/REST 协议(protocol)的新手。

代码如下:

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

最佳答案

根据 The Manual ...

CURLOPT_READFUNCTION explained

...

If you set this callback pointer to NULL, or don't set it at all, the default internal read function will be used. It is doing an fread() on the FILE * userdata set with CURLOPT_READDATA.

但是你也没有设置CURLOPT_READDATA。所以再看The manual ...

CURLOPT_READDATA explained

...

By default, this is a FILE * to stdin.

所以您的程序“挂起”的原因似乎是因为它正在等待某些东西到达标准输入 stdin

所以它应该是这样工作的。

1) 如果您什么都不做,发送到服务器的数据来自标准输入(通常是键盘)。

2) 如果您设置 CURLOPT_READDATA 那么它必须是一个FILE* 您打开了一个输入文件,其中包含您要发送的数据。

3) 如果您设置了CURLOPT_READFUNCTION,那么CURLOPT_READDATA 可以指向您的函数完成其任务所需的任何内容向服务器发送数据。

关于c++ - libcurl:curl_easy_perform block ,除非设置了 CURLOPT_READFUNCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573092/

相关文章:

c# - 创建原始图形元素(无 Windows chrome)

c++ - C 变量可以声明为空吗?

c++ - 原子读取是否保证读取到最新值?

java - 错误 :(229, 12) java : exception org. springframework.web.client.HttpStatusCodeException 已被捕获

java - Spring Data REST - 在不创建/搜索/findAll URL 的情况下覆盖存储库 findAll

http - 在通过 HTTP 上传到 Windows 框时,有什么方法可以在文件中找到 "peek"吗?

c++ - 为什么 Rust 需要 C++ 工具链来生成 Rust 二进制文件,而像 Go 这样的语言没有这个要求?

validation - JAX RS 泽西模式验证

json - Twilio HTTP 响应 : Not parsing XML/JSON

android - 从浏览器填写 http 表单和在 Android 中使用 httppost 之间的区别