如何生成PHP soap客户端代码?

时间:2009-11-01 09:25:46

标签: php soap wsdl soap-client

有没有办法从WSDL文件生成PHP Soap客户端?

我的意思是.net中的wsdl.exesvcutil.exe,它为一个可以作为服务客户端的类生成代码,而不是像:

$WSDL     = new SOAP_WSDL($wsdl_url); 
$client   = $WSDL->getProxy(); 

我的问题是我希望PHP客户端能够使用服务,即使该服务没有公开其WSDL。

6 个答案:

答案 0 :(得分:11)

我发现生成器非常有用

https://github.com/wsdl2phpgenerator/wsdl2phpgenerator

说明(来自github):

  • 从最新版本
  • 下载wsdl2phpgenerator-2.3.0.phar
  • 运行" php wsdl2phpgenerator-2.3.0.phar -i input.wsdl -o tmp / my / directory / wsdl"

也为web托管的wsdl工作

例如

php wsdl2phpgenerator-2.3.0.phar -i http://someurl/input.wsdl -o tmp/my/directory/wsdl

答案 1 :(得分:9)

您可以使用包SOAP_WSDL(http://pear.php.net/reference/SOAP-0.9.4/SOAP/SOAP_WSDL.html#methodgenerateProxyCode)方法中提供的方法[generateProxyCode],并将其保存到文件中:

$WSDL     = new SOAP_WSDL($wsdl_url); 
$php      = $WSDL->generateProxyCode();
file_put_contents('wsdl_proxy.php', '<?php ' . $php . ' ?>');

require 'wsdl_proxy.php';

答案 2 :(得分:8)

有一个应用程序,它叫做wsdl2phpgenerator:

http://code.google.com/p/wsdl2phpgenerator/

针对WSDL文件运行它,它将基于WSDL服务生成类。

答案 3 :(得分:4)

只是为了帮助遇到这篇文章的其他人并且认为“我是如何使用这个SOAP_WSDL工作的?” (像我一样)

打开命令行并进入你的php目录(我在这个例子中安装了XAMPP Lite)

进入php目录后,我运行了pear.bat脚本。在此之后,我可以通过cmd行输入以下内容

pear -V(提供安装版本)

梨列表

如果键入以上内容但未看到SOAP,则需要从cmd行执行以下操作:

  • pear install Net_DIME-1.0.1

  • pear install Mail_Mime-1.5.2

  • pear install Mail-1.2.0b1

  • pear install SOAP-0.12.0

现在,在安装这些软件包并执行另一个“梨列表”后,您应该看到SOAP列出。

如果是这样,你可以在SOAP下的pear目录中包含对php文件的引用。

此路径的一个示例可能是C:\ xampplite \ php \ PEAR \ SOAP

答案 4 :(得分:0)

我使用了 wsdl2php ,一个简单的PEAR工具;似乎项目已经死了,但你仍然可以在这里下载最新版本:http://sourceforge.net/projects/wsdl2php/

它需要一台带有PHP 5和PEAR的开发机器,你必须使用这个PEAR命令安装它:

sudo pear install wsdl2php-0.2.1-pear.tgz

在此之后,您可以使用以下命令生成PHP类文件:

wsdl2php <WSDL_URL>

它生成一个扩展SoapClient的主类,以及代表请求,响应和复杂对象的许多其他类,因此在使用像NetBeans这样的“intellisense”的IDE中进行开发时非常有用。

答案 5 :(得分:0)

我试图使用此处列出的内容。

找到另一个选择:https://github.com/mikaelcom/WsdlToPhp

与之前的比较:

  • 没有依赖关系。 用于生成器和创建的客户端。

  • out 参数的类。

  • 使用创建的客户端的示例。 当然不是那么重要。但有时非常有用

  • 较少的代码(与SOAP_WSDL比较)

劣势:

  • 答案和任何复杂的子类型都包含在另一个包含技术信息的对象中。