【问题标题】:wsdl operation with unlimited parameters具有无限参数的wsdl操作
【发布时间】:2012-08-06 15:17:22
【问题描述】:

我必须为从另一个服务传递数据的 SoapServer 创建 WSDL。提供给我的数据具有以下结构:

<operationName>
    <parameterHeader></parameterHeader>
    <parameterData1></parameterData1>
    <parameterData2></parameterData2>
    ...
    <parameterDataN></parameterDataN>
</operationName>

这意味着我必须创建方法

function operationName(parameterHeader, parameterData1, parameterData2, ... parameterDataN){
  ...
}

不可能知道我的操作会提供多少参数。

作为一种解决方案,我正在尝试为不带参数的方法创建 WSDL,但在此方法内部使用函数 func_get_args() 来获取所有参数。

不幸的是,我仍然无法创建正确的 WSDL,而且我不确定这是否可行。

我的网络服务应该接收的精确数据(示例)如下:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
    <env:Header/>
    <env:Body>
        <tns:operationResponse xmlns:tns="http://somedomain.com/demo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                              xmlns="http://anotherdomain.com/anotherdemo">
            <tns:ResponseHeader attrName1="data1" attrName2="data2" attrName3="data3" />
            <tns:ObjectData>
                <tns:ElementData ElementAttr1="data1" ElementAttr2="data2" ElementAttr3="data3"/>
            </tns:ObjectData>
            <tns:ObjectData>
                <tns:ElementData ElementAttr1="data21" ElementAttr2="data22" ElementAttr3="data23"/>
            </tns:ObjectData>
            <tns:ObjectData>
                <tns:ElementData ElementAttr1="data31" ElementAttr2="data32" ElementAttr3="data33"/>
            </tns:ObjectData>
            <tns:ObjectData>
                <tns:ElementData ElementAttr1="data41" ElementAttr2="data42" ElementAttr3="data43"/>
            </tns:ObjectData>
        </tns:operationResponse>
    </env:Body>
</env:Envelope>

您对此类 WSDL 是否有任何经验,或者对如何获得提供的数据结构有一些想法?

我认为可能会考虑作为参数名称,因此其他数据可以用作complexType。也许 WSDL 提供了一些技巧……

【问题讨论】:

  • 我不知道 WSDL 规范是否支持这一点。有一个集合参数并传入一个数组有什么问题?

标签: php wsdl soapserver


【解决方案1】:

和 Mike 一样,我的第一种方法是使用数组参数。虽然可以想象一个过程中有无限的参数,但我很确定 WSDL 中的这种定义只是枚举的,因此您必须明确列出您的参数。 还要考虑一些 Web 服务实现可能无法管理无限的参数(在这种情况下,在请求者端,所以这是他们的问题,而不是你的问题)。

【讨论】:

  • 是的,对于这种情况,使用数组是正确的方法。但不幸的是,我无法更改输入数据的格式。
  • 这看起来像是一份设计不佳的合约。应该是 123... paramDataArray>
  • 我刚刚编辑了我的帖子并提供了更多/更少精确的示例。但是在即使这些数据设计不佳的情况下,是否可以通过 PHP 中的 SoapServer 正确接收这些数据。
  • 我知道这种数据格式已经在其他系统中使用过,所以它可以工作(但可能不是 SoapServer)。当然,我可以接收请求 XML 并对其进行解析,但这种解决方案对我来说并不合适。
  • 重新阅读您最初的问题,我不确定我是否理解您需要做什么。您的意思是,独立于 WSDL,请求者将向您发送一个带有无限参数的响应?我问这个是因为通常请求者应该遵守您的 WSDL,反之亦然。在这种情况下,他们似乎会忽略您的 WSDL,因为您无法做正确的事情,即将参数转换为数组。所以,不需要 WSDL 文件:只需在非 WSDL 模式下创建 SoapServer(在构造函数中传递 NULL 而不是 WSDL 参数,并在第二个参数中设置 uri 选项)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2017-08-29
  • 2011-11-06
  • 2016-01-13
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多