我打算使用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 ......等等。
谢谢。
答案 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)
)
...