libcurl: 写入回调函数未被调用
libcurl: write call back function not invoked
我正在使用 libcurl
发送 POST
请求,并尝试使用回调函数获得响应。下面是相关代码。
main ()
{
...
curl_global_init(CURL_GLOBAL_ALL);
CURL *curl = curl_easy_init ();
curl_easy_setopt(curl, CURLOPT_URL, url_string);
curl_easy_setopt(curl, CURLOPT_POST, 1);
if (strlen(query_string) > 0)
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query_string);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_buffer);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCB);
CURLcode res = curl_easy_perform(curl);
if (CURLE_OK == res)
printf("response: %s\n", write_buffer.data);
else
printf("curl failed\n");
curl_easy_cleanup(curl);
curl_global_cleanup();
...
}
struct BufferType
{
Str data;
BufferType() {};
size_t Append(char *src, size_t size, size_t nmemb)
{
data.Append(Str(src, size * nmemb));
return size * nmemb;
}
};
size_t WriteCB(char *data, size_t size, size_t nmemb, BufferType *buffer)
{
printf("WriteCB: %s\n", data);
fflush(stdout);
return buffer->Append(data, size, nmemb);
}
当我启动程序时,我可以看到它正在执行(服务器响应“200 OK”)。但是程序只是挂在那里,这是输出:
WriteCB: HTTP/1.1 100 Continue
WriteCB:
更多信息:如果我对其他 URL 使用 GET 方法,并将与 POST 相关的两行更改为
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
然后代码就可以正常工作了。
有什么问题吗?
已解决
在命令行中,我让用户指定查询字符串,并且我有一个语句,如果 "query_string" 为空则不调用
"curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query_string);".
将 curl 设置为详细显示请求 header 有 "Expect: 100-continue"。所以我猜这是因为尚未设置查询字符串。就算是空的,也要设置。
很高兴您发现了问题。我最初虽然您可能没有正确使用 POST 和 libcurl,但这很容易做到。所以,我尝试了您的代码,但没有发现任何问题。
所以,这可能是您的设置方式或服务器本身的问题。回调的行为符合预期。我想尝试一下,因为我通常像这样将 POST 与 libcurl 一起使用:
struct curl_httppost* post = NULL;
struct curl_httppost* last = NULL;
curl_formadd(&post, &last, ..., CURLFORM_END);
Here is an example
我正在使用 libcurl
发送 POST
请求,并尝试使用回调函数获得响应。下面是相关代码。
main ()
{
...
curl_global_init(CURL_GLOBAL_ALL);
CURL *curl = curl_easy_init ();
curl_easy_setopt(curl, CURLOPT_URL, url_string);
curl_easy_setopt(curl, CURLOPT_POST, 1);
if (strlen(query_string) > 0)
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query_string);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_buffer);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCB);
CURLcode res = curl_easy_perform(curl);
if (CURLE_OK == res)
printf("response: %s\n", write_buffer.data);
else
printf("curl failed\n");
curl_easy_cleanup(curl);
curl_global_cleanup();
...
}
struct BufferType
{
Str data;
BufferType() {};
size_t Append(char *src, size_t size, size_t nmemb)
{
data.Append(Str(src, size * nmemb));
return size * nmemb;
}
};
size_t WriteCB(char *data, size_t size, size_t nmemb, BufferType *buffer)
{
printf("WriteCB: %s\n", data);
fflush(stdout);
return buffer->Append(data, size, nmemb);
}
当我启动程序时,我可以看到它正在执行(服务器响应“200 OK”)。但是程序只是挂在那里,这是输出:
WriteCB: HTTP/1.1 100 Continue
WriteCB:
更多信息:如果我对其他 URL 使用 GET 方法,并将与 POST 相关的两行更改为
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
然后代码就可以正常工作了。
有什么问题吗?
已解决
在命令行中,我让用户指定查询字符串,并且我有一个语句,如果 "query_string" 为空则不调用 "curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query_string);".
将 curl 设置为详细显示请求 header 有 "Expect: 100-continue"。所以我猜这是因为尚未设置查询字符串。就算是空的,也要设置。
很高兴您发现了问题。我最初虽然您可能没有正确使用 POST 和 libcurl,但这很容易做到。所以,我尝试了您的代码,但没有发现任何问题。
所以,这可能是您的设置方式或服务器本身的问题。回调的行为符合预期。我想尝试一下,因为我通常像这样将 POST 与 libcurl 一起使用:
struct curl_httppost* post = NULL;
struct curl_httppost* last = NULL;
curl_formadd(&post, &last, ..., CURLFORM_END);
Here is an example