2013-10-17 138 views
0

我一直在研究一个项目(我将保留具体的详细信息,包括随机数据),这涉及到我们的系统(PHP 5.3.x +)与API的集成(他们提供了一个SDK)的一家大公司。他们提供了一个WSDL并声称我们需要匹配他们的方法,他们提供了输出(Soap服务器生成的XML)外观的示例。Zend Soap服务器/ WSDL

现在,一切都按预期工作。当我从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> 
在返回

我感谢任何帮助和输入的主题。

回答

0

SOAP的关键特性是它使用XML,而XML可以有很多不同的样式,但仍然意味着相同。

我想(但我只能猜测,因为你没有提供细节),你的两个问题可能是不存在的。

1.)响应XML结构的名称应该与WSDL中提到的名称一致。您正在发布WSDL,因此您应该检查这两者是否匹配。请注意,重要的入口点是SOAP方法 - 其后的所有内容都是在WSDL本身中定义的,只要正确使用提及的名称,任何消费客户端都应该能够弄清楚。 2)这基本上是相同的,但更容易:XML允许使用名称空间,并且这些名称空间可以在多个位置定义,结果不是字面上相同,但每个XML解析器都会明白它们是一样。因此,您应该检查响应的XML标题中是否提及了所需的名称空间“ns1”。每个XML文档都有一个基本名称空间,不需要在属于它的每个元素上重复。

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

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

+0

您好,非常感谢您的回复。我终于看完了。我们认为,除了制定与非标准指导方针相匹配的回应外,我们还可以做的不多。无论如何,这是非常有用的,并为我澄清了一些事情。 – Robbie