You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建WSDL请求体并直接调用JAX-WS编写的Web服务?

直接HTTP调用JAX-WS服务的正确方式及错误修复

一、先修正你的请求错误

你当前的请求有三个核心问题,导致了XML解析失败:

  1. 请求地址错误:你POST到了http://127.0.0.1:9876/ts?wsdl,但?wsdl是用来获取WSDL元数据的地址,实际调用服务的端点是http://127.0.0.1:9876/ts(去掉?wsdl参数)。
  2. 命名空间不匹配且未正确声明:你的接口@Action注解里的命名空间是http://api.example.org/TimeService,但请求里用了无关的http://www.4d.com/namespace/default,同时使用了ns1前缀却没声明它对应的命名空间。
  3. 多余的无效属性: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

  1. 确定服务端点地址:去掉WSDL地址的?wsdl参数,就是实际调用的HTTP地址。
  2. 设置必要的HTTP头:
    • Content-Type必须为text/xml; charset=UTF-8
    • SOAPAction头的值要和接口@Action注解的input属性完全一致,即"http://api.example.org/TimeService/getTimeAsStringRequest"(注意引号不能丢)
  3. 构建SOAP信封:
    • 声明SOAP标准命名空间http://schemas.xmlsoap.org/soap/envelope/,通常绑定soapenv前缀
    • 声明服务的目标命名空间(从@Action的input路径中提取,即http://api.example.org/TimeService),绑定任意前缀(比如ts)
    • 在<soapenv:Body>中,用绑定的前缀+方法名作为元素(因为该方法无参数,直接写空标签即可)

三、验证调用结果

发送上述请求后,服务端会返回包含当前时间字符串的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:10:29