如何构建WSDL请求体并直接调用JAX-WS编写的Web服务?
直接HTTP调用JAX-WS服务的正确方式及错误修复
一、先修正你的请求错误
你当前的请求有三个核心问题,导致了XML解析失败:
- 请求地址错误:你POST到了
http://127.0.0.1:9876/ts?wsdl,但?wsdl是用来获取WSDL元数据的地址,实际调用服务的端点是http://127.0.0.1:9876/ts(去掉?wsdl参数)。 - 命名空间不匹配且未正确声明:你的接口@Action注解里的命名空间是
http://api.example.org/TimeService,但请求里用了无关的http://www.4d.com/namespace/default,同时使用了ns1前缀却没声明它对应的命名空间。 - 多余的无效属性:
xsi:type="xsd:any"完全没必要(该方法无参数),且xsi、xsd命名空间也未定义,直接导致XML解析报错。
正确的请求示例
POST http://127.0.0.1:9876/ts HTTP/1.1 Content-Type: text/xml; charset=UTF-8 SOAPAction: "http://api.example.org/TimeService/getTimeAsStringRequest" <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ts="http://api.example.org/TimeService"> <soapenv:Body> <ts:getTimeAsString/> </soapenv:Body> </soapenv:Envelope>
二、如何根据现有信息构建SOAP请求XML
- 确定服务端点地址:去掉WSDL地址的
?wsdl参数,就是实际调用的HTTP地址。 - 设置必要的HTTP头:
Content-Type必须为text/xml; charset=UTF-8SOAPAction头的值要和接口@Action注解的input属性完全一致,即"http://api.example.org/TimeService/getTimeAsStringRequest"(注意引号不能丢)
- 构建SOAP信封:
- 声明SOAP标准命名空间
http://schemas.xmlsoap.org/soap/envelope/,通常绑定soapenv前缀 - 声明服务的目标命名空间(从@Action的input路径中提取,即
http://api.example.org/TimeService),绑定任意前缀(比如ts) - 在
<soapenv:Body>中,用绑定的前缀+方法名作为元素(因为该方法无参数,直接写空标签即可)
- 声明SOAP标准命名空间
三、验证调用结果
发送上述请求后,服务端会返回包含当前时间字符串的SOAP响应,格式大致如下:
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns2:getTimeAsStringResponse xmlns:ns2="http://api.example.org/TimeService"> <return>2024-05-20 15:30:00</return> </ns2:getTimeAsStringResponse> </soapenv:Body> </soapenv:Envelope>
内容的提问来源于stack exchange,提问作者Michael Neumair
相关产品推荐
相关产品推荐

