gpt4 book ai didi

c++ - 通过多个回调处理来自 libcurl 的 HTTP 响应

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:33 25 4
gpt4 key购买 nike

我正在使用 libcurl 发送 HTTP post 请求并随后处理响应。收到响应后,库使用通过 curl_easy_setopt 提供给 CURLOPT_WRITEFUNCTION 属性的函数调用回我的程序。

// callback function
std::size_t on_data(const char* buffer, const std::size_t size, const std::size_t nmemb, void* context);

从文档中不清楚你可以将数据保留在缓冲区中(通过从回调中返回 0)或者你必须将数据复制到本地缓冲区,然后在每个后续回调中继续附加到此,直到你收到整个消息。

我的问题是:

  1. 获取整个消息长度的最佳方法是什么?它是通过 CURLOPT_WRITEHEADERContent-Length header 中获取的吗?
  2. 有没有办法避免复制部分响应,而是等待收到最后一条消息,然后再完整地处理它?<​​/li>

最佳答案

至于CURLOPT_WRITEFUNCTION选项与文档明确指出此功能必须:

[r]eturn the number of bytes actually taken care of. If that amount differs from the amount passed to your function, it'll signal an error to the library. This will abort the transfer and return CURLE_WRITE_ERROR.

因此,除非您想明确中止传输,否则您应该始终返回实际大小,即 size * nmemb .此外,如果您选择使用本地缓冲区,那么是的,您必须注意将传入数据复制到其中(并注意重新分配),如 docs/examples/getinmemory.c 所示。示例代码。

请注意,如果您不想使用内存缓冲区,您也可以通过 CURLOPT_WRITEDATA 使用文件。选项,如图所示通过 docs/examples/url2file.cdocs/examples/fopen.c示例。

否则:

  1. 我会说,要预先检查您愿意获取的资源的大小,那么您应该执行 HEAD请求(通过 CURLOPT_NOBODY 设置为 1,CURLOPT_HEADER 也设置为 1)要求通过 CURLOPT_WRITEHEADER 写入 HTTP header 和 CURLOPT_WRITEFUNCTION最后解析 Content-Length值(value)。但是:这绝对不是 POST 的方式请求,因为它不是幂等的!

  2. 再次重申,如果您不适应不断增长的内存缓冲区(例如,可能是因为您希望获得非常大的响应),那么您应该使用 CURLOPT_WRITEDATA 处理文件的能力。这样响应就会逐渐写入磁盘。完成后,然后使用您的文件 - 以您想要的方式包含整个消息。

关于c++ - 通过多个回调处理来自 libcurl 的 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12903587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com