必须用curlopt_postfields传xml字符串作请求体,并设curlopt_postfieldsize;content-type须为application/xml;确保utf-8编码;用curlopt_httpheader添加请求头;调试开curlopt_verbose。

curl_easy_setopt 传 XML 数据必须用 CURLOPT_POSTFIELDS
POST XML 不是拼 URL 参数,得把整个 XML 字符串当请求体发出去。常见错误是误用 CURLOPT_URL 拼接 XML、或用 CURLOPT_POST 单独设为 1L 却没给数据——这样发的是空 body,服务端收不到 XML。
- XML 内容必须通过
CURLOPT_POSTFIELDS传入,类型是const char *,指向以\0结尾的字符串 - 别用
CURLOPT_POST单独控制;libcurl 会根据CURLOPT_POSTFIELDS是否非空自动设为 POST 方法 - 如果 XML 含中文或特殊字符,确保源字符串是 UTF-8 编码,且服务端也按 UTF-8 解析
- 记得用
CURLOPT_POSTFIELDSIZE显式传长度(尤其 XML 字符串里含\0时),否则 libcurl 会用strlen截断
Content-Type 必须手动设成 application/xml 或 text/xml
libcurl 默认发 application/x-www-form-urlencoded,服务端看到 XML 却没对应头,大概率直接拒收或解析失败。这不是可选配置,是硬性要求。
- 用
curl_slist_append添加Content-Type: application/xml; charset=utf-8头 - 避免只写
text/xml——某些严格服务端(如部分 Java Spring 接口)只认application/xml - 设完头列表后,必须用
CURLOPT_HTTPHEADER绑定到 easy handle,且后续不能提前curl_slist_free_all - 如果服务端还要求
Accept: application/xml,一并加进 header 列表里
XML 字符串里有双引号或换行?用 raw 字符串或转义处理
手写 XML 字符串时,C++ 字面量里的 "、\n、\t 容易漏转义,导致编译不过或运行时 XML 格式错乱。服务端报 XML parse error 或 400 Bad Request 很可能就卡在这儿。
- 推荐用 C++11 raw string literal:
R"(<root><item id="123">test</item></root>)",免去所有反斜杠转义 - 如果 XML 来自文件或用户输入,确保读取后没带 BOM、没混入 Windows
\r\n(多数服务端接受,但少数校验严格) - 不要在 XML 字符串末尾手动加
\n——HTTP body 不需要换行结尾,加了反而可能被当成内容的一部分 - 调试时可用
CURLOPT_VERBOSE开启,看 curl 实际发出的请求头和 body 是否符合预期
上传失败返回 411 或 500?检查 Content-Length 和服务器限制
有些服务器(尤其是 Nginx 反代后端)对 POST body 长度敏感,411 Length Required 表示你没传 Content-Length,而 500 可能是后端 XML 解析崩溃,源头常是长度不匹配或编码异常。
立即学习“C++免费学习笔记(深入)”;
- libcurl 在用
CURLOPT_POSTFIELDS时通常自动算Content-Length,但若同时用了CURLOPT_READFUNCTION,就得自己算并设CURLOPT_INFILESIZE - 如果 XML 超过几 MB,确认服务端是否限制了最大 body:Nginx 有
client_max_body_size,Spring Boot 有spring.servlet.multipart.max-request-size - 大 XML 建议改用
CURLOPT_READFUNCTION流式上传,避免全量内存加载;但必须同步提供CURLOPT_INFILESIZE,否则某些服务器拒绝接收 - 别忽略
curl_easy_perform返回值:不是CURLE_OK就代表网络层已失败,不用再查 HTTP 状态码
XML 本身没“上传”概念,本质是发一个带 XML body 的 POST 请求;最容易被忽略的是 header 和 encoding 的耦合性——Content-Type 说 UTF-8,字符串就得真是 UTF-8,中间任何环节转码都会让服务端解析失败。










