C++使用CURL上传XML Libcurl库发送POST XML示例

1次阅读

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

C++使用CURL上传XML Libcurl库发送POST XML示例

curl_easy_setopt 传 XML 数据必须用 CURLOPT_POSTFIELDS

POST XML 不是拼 URL 参数,得把整个 XML 字符串当请求体发出去。常见错误是误用 CURLOPT_URL 拼接 XML、或用 CURLOPT_POST 单独设为 1L 却没给数据——这样发的是空 body,服务端收不到 XML。

  • XML 内容必须通过 CURLOPT_POSTFIELDS 传入,类型是 const char *,指向以 结尾的字符串
  • 别用 CURLOPT_POST 单独控制;libcurl 会根据 CURLOPT_POSTFIELDS 是否非空自动设为 POST 方法
  • 如果 XML 含中文或特殊字符,确保源字符串是 UTF-8 编码,且服务端也按 UTF-8 解析
  • 记得用 CURLOPT_POSTFIELDSIZE 显式传长度(尤其 XML 字符串里含 时),否则 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++ 字面量里的 "nt 容易漏转义,导致编译不过或运行时 XML 格式错乱。服务端报 XML parse Error400 Bad Request 很可能就卡在这儿。

  • 推荐用 C++11 raw String literal:R"(<root><item id="123">test</item></root>)",免去所有反斜杠转义
  • 如果 XML 来自文件或用户输入,确保读取后没带 bom、没混入 windows rn(多数服务端接受,但少数校验严格)
  • 不要在 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_sizespring bootspring.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,中间任何环节转码都会让服务端解析失败。

text=ZqhQzanResources