PUT请求必须显式设置CURLOPT_CUSTOMREQUEST为"PUT",同时启用CURLOPT_UPLOAD=1L以发送请求体;自定义Header需用curl_slist_append构造链表并正确释放;流式上传须指定CURLOPT_INFILESIZE避免服务端400错误;调试应开启CURLOPT_VERBOSE。

PUT请求必须显式设置CURLOPT_CUSTOMREQUEST
Libcurl默认对PUT不做特殊处理,直接传URL和数据会触发POST行为。不设CURLOPT_CUSTOMREQUEST,哪怕调用curl_easy_setopt(curl, CURLOPT_PUT, 1L)也无效——后者只适用于上传文件到FTP/FTPS,对HTTP PUT完全不生效。
正确做法是:curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"),同时必须配CURLOPT_UPLOAD为1L(否则libcurl可能忽略请求体)。
-
CURLOPT_UPLOAD启用上传模式,让libcurl把CURLOPT_POSTFIELDS或CURLOPT_READFUNCTION提供的数据当作请求体发送 - 若用
CURLOPT_POSTFIELDS,libcurl会自动加Content-Length;若用流式上传(CURLOPT_READFUNCTION),需手动设CURLOPT_INFILESIZE或CURLOPT_POSTFIELDSIZE - 不要混用
CURLOPT_POST和CURLOPT_CUSTOMREQUEST,否则行为未定义
自定义Header要用curl_slist_append构造链表
libcurl不接受字符串数组或map式header,必须用struct curl_slist*链表。常见错误是直接传"Authorization: Bearer token"字符串给CURLOPT_HTTPHEADER,结果静默失败或header被忽略。
示例代码片段:
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
立即学习“C++免费学习笔记(深入)”;
struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "Authorization: Bearer abc123"); headers = curl_slist_append(headers, "X-Request-ID: 7f8c4a"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
- 每条header字符串格式为
"Key: Value",冒号后空格可选但建议保留 - 必须以
curl_slist_free_all(headers)释放内存,否则泄漏 - 如果某header值含换行或控制字符,libcurl会截断或报错
CURLE_BAD_FUNCTION_ARGUMENT
PUT请求体长度不匹配会导致CURLE_SEND_ERROR或服务端400
当用CURLOPT_READFUNCTION流式上传时,libcurl依赖CURLOPT_INFILESIZE判断总长度。若设为-1(表示未知长度),HTTP/1.1下会用chunked encoding,但部分服务端(尤其老版本Nginx、某些API网关)拒绝chunked PUT,直接返回411或400。
- 优先用
CURLOPT_POSTFIELDS+CURLOPT_POSTFIELDSIZE,显式指定字节数 - 若必须流式上传,确保服务端支持
Transfer-Encoding: chunked,或提前计算好长度填入CURLOPT_INFILESIZE - 调试时加
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L),观察实际发出的Content-Length是否与预期一致
常见错误:CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST在测试环境引发连接失败
本地调试HTTPS PUT时,若服务端用自签名证书或域名不匹配,libcurl默认拒绝连接并返回CURLE_SSL_CACERT或CURLE_PEER_FAILED_VERIFICATION。这不是header或PUT逻辑问题,但容易误判。
- 临时绕过验证(仅限开发):
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L)和curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L) - 生产环境必须恢复验证,并通过
CURLOPT_CAINFO指定可信CA路径 - 注意:禁用验证后,
CURLOPT_SSLCERT/CURLOPT_SSLKEY仍需正确配置(如需客户端证书)
header拼写错误、PUT方法没显式声明、请求体长度未告知、SSL验证拦截——这四个点卡住的人最多。其他都是细节调整。

















