【问题标题】:libcurl: write call back function not invokedlibcurl:未调用的写回调函数
【发布时间】:2015-03-28 05:34:03
【问题描述】:

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

然后代码工作正常。

可能出了什么问题?

【问题讨论】:

  • "为了简洁起见,我在这里避免使用它。" 请展示它,以便有人可以确保它写得正确。
  • 好的,看起来我还有一些额外的工作要做来处理“100 continue”,继续挖掘......但欢迎任何提示。谢谢。
  • libcurl 为您处理 100 Continue 响应。您无需执行任何操作即可启用该逻辑。但是,如果要禁用它,可以使用CURLOPT_HTTPHEADER 禁用Expect: 100-continue 请求头(不推荐)。

标签: http http-post libcurl


【解决方案1】:

已解决

在命令行中,我让用户指定查询字符串,并且我有一个语句,如果“query_string”为空,则不要调用 “curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query_string);”。

将 curl 设置为详细表明请求标头具有“期望:100-继续”。所以我猜这是因为尚未设置查询字符串。即使是空的,也应该设置。

【讨论】:

  • 为了将来参考,您可以发布自己问题的答案。如果您在其他人之前找到解决方案,请随时将其作为答案发布,而不是作为对原始问题的编辑。
【解决方案2】:

很高兴您发现了问题。我最初虽然你可能没有正确使用 POST 和 libcurl,这很容易做到。因此,我尝试了您的代码,但没有发现任何问题。

因此,它必须是您设置它的方式或服务器本身的问题。回调的行为符合预期。我想尝试一下,因为我通常像这样将 POST 与 libcurl 一起使用:

struct curl_httppost* post = NULL;
struct curl_httppost* last = NULL;

curl_formadd(&post, &last, ..., CURLFORM_END);

Here is an example

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 2015-01-22
    • 2018-10-18
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多