postman调用soap接口需设body为raw+xml格式、添加soapaction请求头、content-type匹配soap版本,并确保xml命名空间与wsdl严格一致,否则易报400/500/415错误或静默失败。

Postman 里怎么填 SOAP 的 XML Body
必须选 raw,且右上角语言下拉菜单要手动设成 XML (application/xml),不是 Text 或自动检测。Postman 不会根据内容自动识别 SOAP,如果这里选错,服务端大概率返回 400 Bad Request 或直接拒收。
常见错误现象:XML 看起来完全正确,但服务器报 Missing SOAPAction header 或 Invalid Content-Type —— 其实是 Body 类型没设对,或者 Header 漏了关键项。
- Body 内容从
<?xml version="1.0" encoding="utf-8"?>开始,第一行不能空 - 根节点必须是
<envelope></envelope>,命名空间不能少:xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" - 别把 WSDL 里
<types></types>那段直接抄进来当 Body,那是定义,不是调用
SOAPAction 请求头为什么总被忽略
绝大多数老派 SOAP 服务(尤其 .NET ASMX 或 Java Axis)强制校验 SOAPAction 请求头,值必须和 WSDL 中对应 <operation></operation> 的 soapAction 属性一致,哪怕只是空字符串也要显式传。
不填或填错的典型表现:返回 500 Internal Server Error,但日志里可能只写 “Invalid SOAPAction”,没有更多线索。
- 在 Postman 的
Headers标签页手动添加一行:SOAPAction→"http://tempuri.org/YourMethodName"(引号必须保留,部分服务要求) - 如果 WSDL 里该操作的
soapAction="",Header 值就填空字符串"",不是删掉这一行 - 注意大小写和协议前缀(
http://还是https://),有些服务严格匹配
Content-Type 是 text/xml 还是 application/soap+xml
取决于服务端实现年代:text/xml 对应 SOAP 1.1,application/soap+xml 对应 SOAP 1.2。90% 的遗留系统用前者,硬切后者会直接 415 Unsupported Media Type。
查法很简单:打开 WSDL 地址,在 <binding></binding> 下找 <binding style="document"></binding>,再看紧挨着的 <operation soapaction="..."> 所属的 <code><porttype></porttype>,它的 transport 属性如果是 http://schemas.xmlsoap.org/soap/http,就是 1.1;如果是 http://www.w3.org/2003/05/soap/bindings/HTTP/,才是 1.2。
- 保险起见,先试
text/xml; charset=utf-8,失败再换application/soap+xml; charset=utf-8 - Postman 的
Content-TypeHeader 必须和 Body 右上角选的语言一致,否则服务端解析器可能直接放弃 - UTF-8 BOM 会导致解析失败,XML 文件保存时选 “UTF-8 no BOM”
XML 中的命名空间和前缀怎么对得上
WSDL 定义的 targetNamespace 和你 Body 里调用的元素前缀必须能映射上,否则服务端找不到对应方法。这不是格式问题,是契约问题。
典型症状:返回 Server was unable to process request. ---> Object reference not set to an instance of an object.(.NET 常见),实际就是命名空间没匹配上。
- 在
<body></body>内部的请求元素上,显式声明命名空间,例如:<getuser xmlns:tem="http://tempuri.org/"></getuser> - 不要依赖默认命名空间(
xmlns="..."),SOAP 处理器对默认命名空间的支持不一致 - 如果 WSDL 中
<element name="GetUser"></element>在targetNamespace="http://example.com/api"下,那你的调用就必须带xmlns:ns="http://example.com/api"并用<getuser></getuser>
最麻烦的点往往不在 XML 结构,而在命名空间 URI 的细微差异——多一个斜杠、大小写不同、协议从 http 变 https,都可能让整个请求静默失败。










