使用命名空间的 SOAP 消息

Posted

技术标签:

【中文标题】使用命名空间的 SOAP 消息【英文标题】:SOAP message using namespaces 【发布时间】:2013-11-18 17:08:11 【问题描述】:

我们正在设计一个由外部系统调用的 Web 应用程序。我们将从如下所示的外部系统接收 Web 服务:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tis="http://schemas.tis.com/1.2/" xmlns:der="http://schemas.tis.com/DataProvisioning/">
   <soapenv:Header>
      <tis:SessionId>99999999</tis:SessionId>
   </soapenv:Header>
 <soapenv:Body>
  <tis:Create>
     <tis:MOType>SPPM@http://schemas.tis.com/DataProvisioning/</tis:MOType>
     <tis:MOId>
           <der:codex>12345677</der:msisdn>
     </tis:MOId>

     <tis:MOAttributes>
        <der:createSPDD ProfileID="1"  Action="createData">

           <der:TechProduct Action="add" BarCode="15">
            <der:Arguments ArgName="arg1" ArgType="string" ArgValue="1"></der:Arguments>
            <der:Arguments ArgName="arg3" ArgType="string" ArgValue="2"></der:Arguments>
           </der:TechProduct>
           <der:TechProduct Action="delete" BarCode="21">
            <der:Arguments ArgName="arg1" ArgType="string" ArgValue="1"></der:Arguments>
            <der:Arguments ArgName="arg3" ArgType="string" ArgValue="2"></der:Arguments>
           </der:TechProduct>
        </der:createSPDD>
     </tis:MOAttributes>
  </tis:Create>

如您所见,我们将收到的这个 SOAP Envelope 中包含命名空间。到目前为止,我的 Web 服务应用程序已使用 JAX-WS 和自下而上的方法进行编码(只需将 @WebService 和 @WebMethod 注释添加到类中)。设计需要基于名称空间接收消息的 Web 服务的正确方法是什么?我应该先设计 WSDL 吗?我看不到如何收集 Header 或 Body 中的属性,例如 MoType 或 MoId。有什么帮助吗? 非常感谢

【问题讨论】:

【参考方案1】:

根据您的问题,很难理解您是要公开 Web 服务还是要使用 Web 服务。如果您想公开具有这种结构和名称空间的 Web 服务,您可以选择自下而上或自上而下的方法。您将使用自上而下的方法创建

    WSDL(这里显然可以提及服务相关细节的命名空间) 架构(定义请求和响应元素的命名空间) 从 WSDL 和 Schema 生成 Java 类。 编写 Web 服务接口的实现。

如果您想使用该服务,则无需编写任何 WSDL。从服务提供者处获取 WSDL 和 Schema(如果有),从收到的 WSDL 和 Schema 生成 Java 类。您不必担心基于名称空间读取值,jaxws 框架会为您完成。

Google 使用 jaxws 服务的步骤。

【讨论】:

以上是关于使用命名空间的 SOAP 消息的主要内容,如果未能解决你的问题,请参考以下文章

删除 Soap 标头和命名空间

如果命名空间声明在 SOAP 信封上,如何使用 JAXB 解组 SOAP 响应?

我对 SOAP 命名空间感到困惑

使用soap4r时出现问题,无法将命名空间、编码样式添加到soap信封

带有Zeep的Python SOAP客户端 - 导入命名空间

如何删除Zend_Soap中的命名空间?