我正在使用libcurl发送HTTP post请求并随后处理响应。收到回复后,图书馆会使用CURLOPT_WRITEFUNCTION
属性通过curl_easy_setopt
回复我的程序。
// callback function
std::size_t on_data(const char* buffer, const std::size_t size, const std::size_t nmemb, void* context);
从文档中可以看出,您可以将数据保留在缓冲区上(通过从回调中返回0),或者您必须将数据复制到本地缓冲区,然后在每次后续回调中继续附加到此,直到您收到整个信息。
我的问题是:
Content-Length
标题还是CURLOPT_WRITEHEADER
?答案 0 :(得分:1)
就CURLOPT_WRITEFUNCTION
选项而言,文档明确指出此函数必须:
[r] eturn实际处理的字节数。 如果该金额与传递给您的函数的金额不同, 它会向库发出错误信号。这将中止转移 并返回CURLE_WRITE_ERROR。
因此,除非您想明确中止转移,否则应始终返回实际大小,即size * nmemb
。此外,如果您选择使用本地缓冲区,那么是的,您必须注意将传入的数据复制到其中(并负责重新分配),如docs/examples/getinmemory.c
示例代码所示。
请注意,如果您不想使用内存缓冲区,您还可以通过CURLOPT_WRITEDATA
选项使用文件,如图所示。通过docs/examples/url2file.c
或docs/examples/fopen.c
示例。
否则:
我想说先检查您愿意提取的资源大小是多少,然后您应该执行HEAD
请求(通过CURLOPT_NOBODY
设置为1和{ {1}}也设置为1)要求通过CURLOPT_HEADER
和CURLOPT_WRITEHEADER
写入HTTP标头,最后解析CURLOPT_WRITEFUNCTION
值。但是:这绝对是不采用Content-Length
请求的方式,因为它不是幂等的!
如果您不习惯使用不断增长的内存缓冲区(例如,可能因为您希望获得非常大的响应),那么您应该使用POST
处理文件的能力响应逐步写在磁盘上。完成后,然后使用您的文件 - 包含您希望的整个信息。