0

我一直在从事一个项目(我将使用随机数据保留这篇文章的具体细节),该项目涉及将我们的系统(PHP 5.3.x+)与一家大公司的 API(他们提供 SDK)集成。他们提供了一个 WSDL 并声称我们需要匹配他们的方法,并且他们提供了输出(由 Soap 服务器生成的 XML)外观的示例。

现在,一切都按预期进行。当我从 SoapUI(我用来测试的一个应用程序)发送 XML 请求时,它会正确处理等等,但是 XML 输出与他们的示例不匹配,我们相信他们说我们必须接近他们的示例。

基本上,我们创建了一个使用服务名称初始化的不可知类,它初始化为一个非不可知类,该类通过以下方式使用:

/**
 * The following is used to process Soap Server based on config and any optional settings.
 *
 * @param string $className
 * @param array $options
 * @param object $config
 * @return Zend_Soap_Server
 */
public static function init($className, Array $options = null, $config = null)
{
    // Used to define the class and return object.
    $soap_server        = new Zend_Soap_Server(null, $options);
    $soap_server->setClass($className, null, (isset($config) ? $config : null));
    $soap_server->handle();
    exit;
}

问题本身在于输出的响应。如果他们对所有内容都非常具体,你们会建议我们如何构建 XML 输出?

1.) 我们的方法之一是moneyTransferRequest。当我为此发送 XML 时,它确实找到了方法并对其进行了处理。但是,他们希望它在响应中将方法名称显示为moneyTransferResponse,但它会输出moneyTransferRequestResponse。

2.) 我们的输出(对于变量以及作为对象返回的变量)有多个变量,例如我们会说 $money。此字段将返回为:

<money xsi:type="xsd:string">10.0</money>

他们希望它是:

<ns1:money xsi:type="xsd:string">10.0</money>

在回报。

我感谢有关该主题的任何帮助和意见。

4

1 回答 1

0

SOAP 的关键特性是它使用 XML,而 XML 可以有多种不同的样式,但含义相同。

我认为(但我只能猜测,因为您没有提供详细信息)您的两个问题可能不存在。

1.) 响应 XML 结构的名称应与 WSDL 中提到的名称一致。您正在发布 WSDL,因此您应该检查这两者是否匹配。请注意,重要的入口点是 SOAP 方法 - 此后的所有内容都在 WSDL 本身中定义,只要正确使用提到的名称,任何消费客户端都应该能够弄清楚。

2.) 这基本上是相同的,但更简单:XML 允许使用名称空间,并且这些名称空间可以在多个位置定义,结果实际上并不相同,但每个 XML 解析器都会理解它们是相同的。因此,您应该检查响应的 XML 标头中是否提到了“ns1”所需的命名空间。每个 XML 文档都有一个基本命名空间,它不需要在属于它的每个元素上重复。

<money>元素就是这种情况。您的写作风格使用该基本命名空间,他们的写作风格使用ns1同样在 XML 标头中引入的命名空间快捷方式,但未声明为基本命名空间。因此,只要在两个响应中都有正确的 XML 命名空间的痕迹,我就认为它们是等价的。

坏消息是您无法更改 PHP SoapServer 生成 XML 的方式。您需要创建自己的 SOAP 服务器实现,我认为这完全是对资源的浪费。

于 2013-10-17T20:42:01.233 回答