我正在使用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:
更多信息:如果我将GET方法用于其他网址,并将与POST相关的两行更改为
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
然后代码工作正常。
可能出现什么问题?
答案 0 :(得分:1)
解决
在命令行中,我让用户指定查询字符串,并且我有一个语句,如果“query_string”为空,则不要调用 “curl_easy_setopt(curl,CURLOPT_POSTFIELDS,query_string);”。
将curl设置为verbose表示请求标头具有“Expect:100-continue”。所以我想这是因为查询字符串尚未设置。即使它是空的,也应该设置。
答案 1 :(得分:0)
很高兴你发现了这个问题。我最初虽然你可能没有正确使用POST与libcurl,这很容易做到。所以,我尝试了你的代码,但没有发现任何问题。
因此,它必须是您设置方式或服务器本身的问题。回调表现如预期。我想尝试一下,因为我通常使用带有libcurl的POST,如下所示:
struct curl_httppost* post = NULL;
struct curl_httppost* last = NULL;
curl_formadd(&post, &last, ..., CURLFORM_END);