PHP中的SOAP UI定义和实现

时间:2015-08-08 17:18:07

标签: php xml web-services soap wsdl

我打算使用PHP实现web服务。 Web服务的创建者通过电子邮件向我发送了所需的WSDL,我可以将它们导入到Soap UI中并进行测试。

看到它们工作正常,我的任务是在我的PHP应用程序中重复相同的过程。我做了一些谷歌搜索,发现PHP5已经提供了一个SoapClient来使用webservices。我甚至测试了两个例子,他们工作得很好。但不是使用Soap UI运行的那个。

SoapClient接收WSDL文件的URI作为第一个参数1 - 这是soapui在顶部栏中显示的服务的URL吗?我注意到我测试过的其他web服务,如果将uri复制并粘贴到浏览器,将返回XML格式,其中包含有关webservice的数据。使用soapui指向端点的数据,浏览器只会输出“Lenght Required”411错误消息。

所以我的问题是,SOAP ui用于导入项目的.xml文件是我应该在我的php中指向的文件吗?像:

SoapClient ( "file:://C:\users\something\webservice.xml?wsdl",
['service'=>'login', 'username'=>'something', 'password'=>'secret' ] );

我会通过网络服务信息公开我收到的.xml,但我害怕泄露敏感数据。我将复制请求的标题,省略任何敏感数据

<?xml version="1.0" encoding="UTF-8"?>
<con:soapui-project activeEnvironment="Default" name="" resourceRoot="" soapui-version="5.2.0" abortOnError="false" runType="SEQUENTIAL" id="" xmlns:con="..."><con:settings/><con:interface xsi:type="con:WsdlInterface" wsaVersion="NONE" name="..." type="wsdl" bindingName="{...}GenericTicketConnector_Service" soapVersion="1_1" anonymous="optional" definition="file:/D:/.../Documents/file.wsdl" id="..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:settings/><con:definitionCache type="TEXT" rootPart="file:\D:\...\Documents\file.wsdl"><con:part><con:url>file:\D:\...\Documents\file.wsdl</con:url><con:content><![CDATA[<--!...-->
<wsdl:definitions name="GenericTicketConnector" targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.otrs.org/TicketConnector/">
  <wsdl:documentation/>
  <!--Warning: This WSDL file is for Development and Test purposes ONLY!-->
  <wsdl:types>
    <xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/">

在此之后,.xml文件看起来像普通的wsdl文件,描述了提供的webservices,请求的格式,respose ......等等。

谢谢。

1 个答案:

答案 0 :(得分:1)

我对SoapUI并不熟悉,但是对于 SoapClient (第一个参数)的ctor的WSDL参数,如果你有它,那就没什么区别了HTTP URL或本地文件的路径。

考虑以下示例,它将动态下载WSDL文件到存储示例脚本的目录,然后使用本地文件而不是URL:

// just an example webservice WSDL
$wsdl = 'http://www.webservicex.net/globalweather.asmx?WSDL';

// store the WSDL file in current directory if it does not yet exist
$filename = __DIR__ . '/globalweather.asmx.wsdl';
if (!is_readable($filename)) {
    file_put_contents($filename, fopen($wsdl, 'r'));
}

$soapclient = new SoapClient($filename);
$params     = ['CountryName' => 'Spain', 'CityName' => 'Alicante'];
$response   = $soapclient->getWeather($params);

var_dump($response);

响应是来自Web服务的 GetWeatherResult 的(未映射的) stdClass $soapclient->getWeather调用已经成功,只有在成功加载WSDL的情况下才会出现这种情况。

注意:在Windows操作系统上,问号(&#34; ?&#34;)在文件名中无效,因此请注意您只使用有效的文件名。

WSDL文件包含与Web服务交互时需要知道的所有数据。所以你不需要更多的信息。

...
  <wsdl:service name="GlobalWeather">
    <wsdl:port name="GlobalWeatherSoap" binding="tns:GlobalWeatherSoap">
      <soap:address location="http://www.webservicex.net/globalweather.asmx" />
    </wsdl:port>
...

如本例所示,WSDL包含具体的URI SoapClient(或SoapUI)将发送HTTP请求。如果它接受与否,请尝试使用SoapUI中的本地文件。

编辑 WSDL file of the OTRS Websvervice is available on Github,这是OTRS网络服务采用的示例,只列出了方法和类型:

$wsdl = 'https://raw.githubusercontent.com/OTRS/otrs/master/development/webservices/GenericTicketConnectorSOAP.wsdl';

// store the WSDL file in current directory if it does not yet exist
$filename = __DIR__ . '/GenericTicketConnectorSOAP.wsdl';
if (!is_readable($filename)) {
    file_put_contents($filename, fopen($wsdl, 'r'));
}

$soapclient = new SoapClient($filename);
print_r($soapclient->__getFunctions());
print_r($soapclient->__getTypes());

输出:

Array
(
    [0] => TicketCreateResponse TicketCreate(TicketCreate $parameters)
    [1] => TicketUpdateResponse TicketUpdate(TicketUpdate $parameters)
    [2] => TicketGetResponse TicketGet(TicketGet $parameters)
    [3] => TicketSearchResponse TicketSearch(TicketSearch $parameters)
    [4] => SessionCreateResponse SessionCreate(SessionCreate $parameters)
)
...