libcurl:写入回调函数未被调用

时间:2015-03-27 19:20:53

标签: http http-post libcurl

我正在使用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);

然后代码工作正常。

可能出现什么问题?

2 个答案:

答案 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);

Here is an example