我以前设法使用PHP的SoapClient库调用.NET服务而没有太多问题,但现在我遇到了一种情况,我必须在非WSDL模式下访问相同的服务。
我似乎或多或少地创建了正确的XML结构来发送到服务,但是服务器似乎没有接收我发送的变量。
根据SOAPUI的输出,我应该尝试生成以下SOAP调用:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:int="http://someservices.com/">
<soapenv:Header/>
<soapenv:Body>
<int:getService>
<int:foo>String value for foo</int:foo>
<int:bar>String value for bar</int:bar>
</int:getService>
</soapenv:Body>
</soapenv:Envelope>
我使用SOAPClient生成的输出是:
<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://someservices.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Body>
<ns1:getService env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<foo xsi:type="xsd:string">String value for foo</foo>
<bar xsi:type="xsd:string">String value for bar</bar>
</ns1:getService>
</env:Body>
</env:Envelope>
从.NET服务返回的错误是“预期吧!” - 至少表明服务没有拿起我的第二个参数。
我正在使用以下内容构建我的soap调用:
$foo = 'String value for foo';
$bar = 'String value for bar';
$options = array(
'trace' => 1,
'exceptions' => 1,
'uri' => 'http://someservices.com',
'soapaction' => 'http://someservices.com/getService',
'soap_version' => SOAP_1_2,
'type_map' => array('type_ns' => 'int')
);
$response = $soapclient->__soapCall('getService', array( new SoapParam($foo, 'foo'), new SoapParam($bar, 'bar')), $options);
我不确定问题是什么。现在我猜它可能是一个xmlns属性问题。请注意,SOAPUI调用指定函数调用和参数前面的int:。我试图指定这个xmlns但没有运气。正如您所看到的,Soap Client调用生成的xmlns是:
xmlns:ns1
非常感谢任何帮助。
答案 0 :(得分:2)
事实证明,将命名空间标记为ns1而不是int不是问题。
问题是getService参数以命名空间ns1为前缀,而变量foo和bar不是。
因此,通过将“ns1:”附加到soapCall函数中的Soap Params来解决这个问题,如下所示:
$response = $soapclient->__soapCall('getService', array( new SoapParam($foo, 'ns1:foo'), new SoapParam($bar, 'ns1:bar')), $options);