PHP WebService 实现

jienliang 贡献于2012-10-09

作者 kingdee  创建于2011-05-18 03:03:00   修改者lory  修改于2011-11-09 02:53:00字数10297

文档摘要:本学习笔记是记录学习PHP WebService和WebService在SugarCRM上如何应用的过程及相关知识点摘录。 学习如何实现PHP WebService,php及java中如何调用。
关键词:

PHP WebService实现 ---罗利辉 本学习笔记是记录学习PHP WebService和WebService在SugarCRM上如何应用的过程及相关知识点摘录。 学习如何实现PHP WebService,php及java中如何调用。 1. PHP运行环境与开发环境 1.1 PHP运行环境 学习前先搭建PHP的运行环境与开发环境。 在Windows操作系统下,可以使用简单的方式,安装PHP服务套件。通过在网上搜索,发现已经有将SugarCRM与Apache、MySQL、PHP集成在一起的安装包(SugarCRM中文一键安装包 6.0.3)。 下载后,需要按要求安装,根据提示安装即可。安装后启动服务,就可以登陆SugarCRM了。 1.1 PHP开发环境 开发工具使用Eclipse PHP Studio (EPP),可以从http://epp.php100.com/下载。 略。 2. PHP与WebService 主要了解WebService中基于SOAP的实现。 PHP 的较早版本根本没有对 SOAP 的直接支持,只能通过 PEAR(the PHP Extension and Application Repository) 中的 SOAP 库或者第三方产品 NuSOAP 来开发 Web 服务。不过最近的版本已经改变了这一状况。自 PHP 5 开始新增了内置的 SOAP 扩展 (ext/soap),从此我们不需要下载额外的扩展库或是代码包来开发基于 SOAP 的应用程序了。 PHP 中 Web 服务的两种模式:WSDL 模式和 non-WSDL 模式。简单地可以理解为WSDL 模式对外提供WSDL定义文件,non-WSDL 模式对外不提供WSDL定义文件。 下面学习了解两种常用的SOAP实现方式:使用第三方产品 NuSOAP和使用SOAP扩展。 2.1 NuSOAP实现 NuSOAP是一组功能强大的PHP类,使得使用和创建SOAP消息变得相当简单。 NuSOAP 完全由PHP语言编写,由一系列 PHP 类组成,不需要扩展库的支持,这种特性使得 NuSOAP 可以用于所有的 PHP 环境,不受服务器安全设置的影响。 NuSOAP遵循LGPL发布。NuSOAP提供的特性,包括:   ●简单:NuSOAP的面向对象方法隐藏了SOAP消息组装、解析、提交和接收的有关细节,使用户集中于应用程序本身。   ●WSDL生成和导入:NuSOAP可以生成一个对应于所发布Web服务的WSDL文档,并且能导入一个WSDL引用在NuSOAP客户端使用。   ●代理类:NuSOAP可以生成的一个代理类,允许调用远程方法,如同调用本地方法一样。   ●HTTP代理:出于多种原因(安全性和审计是其中两个原因),有些客户端被强制将请求委托给HTTP代理,由代理代表客户端执行请求。也就是说,需要所有SOAP请求都传递给此代理,而不是直接查询服务器。NuSOAP为指定代理服务器提供了基本支持。   ●SSL:如果可以通过PHP使用CURL扩展,NuSOAP还支持通过SSL的安全通信。 NuSOAP 的安装比较简单,把下载的 NuSOAP 的文件拷贝到服务器上,可以放在独立的目录里,也可以与程序代码放在相同的目录里,只要你的 PHP 代码能够访问到这些文件就可以了。NuSOAP 由一组PHP 类组成,其中最常用到的是类 soap_server和类soapclient。类soap_server 用于创建 WEB 服务,类soapclient在访问WEB服务时会用到。 下面进行一个简单的应用,它包含两个方法getName()与hello()。 getName():无参,仅仅返回字符串:lory。 hello():有两个参数$name和$password,如果$name和$password都是“lory”,返回“Welcome lory, how are you?”,如果不是,返回“Go away!!!”。 2.1.1 non-WSDL模式 服务端:SoapHello.php register('hello'); $server->register('getName'); $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; //最后一步,把客户端通过 post 方式提交的数据,传递给服务对象的 service 方法。 //service 方法处理输入的数据,调用相应的函数或方法,并且生成正确的反馈,传回给客户端。 $server->service($HTTP_RAW_POST_DATA); //注册方法的实现,有参数 function hello($name, $password) { if ($password == 'lory' && $name == 'lory') { return 'Welcome lory, how are you?'; } else { return 'Go away!!!'; } } //注册方法的实现,无参数 function getName() { return 'lory'; } exit(); ?> 该实现中没有支持WSDL,因此也无法将服务器提供的接口暴露。在浏览器中访问服务端文件: 客服端调用程序:soapclient.php getError()) { echo $client->call('getName'); echo "
"; echo $client->call('hello', $parameters); } else { echo " error :",htmlentities($err,ENT_QUOTES); } exit(); ?> 运行结果: 2.1.2 WSDL模式 NuSOAP 内部通过类 "WSDL" 实现对 WSDL 的支持。对于 NuSOAP 的用户来说,不需要关心内部的WSDL类是如何工作的,正确地使用 soap_server 类和 soapclient 类就可以实现对 WSDL 的支持。为了实现 WEB 服务程序对 WSDL 的支持,需要使用 soap_server 的 configureWSDL 方法,并且在调用 soap_server 的 register 方法注册 WEB 服务程序时,需要提供更详细的参数。 服务端:SoapHello.php configureWSDL('MySoapServer', //WEB服务器名称 $NAMESPACE, 'http://192.168.69.241/Myphp'.'/SoapHello.php'); //调用服务对象的 register 方法注册需要被客户端访问的程序。 //只有注册过的程序,才能被远程客户端访问到。 $server->register( 'getName', //注册的方法 array(),//输入参数的定义 array('return'=>'xsd:string'), // 返回参数的定义 $NAMESPACE); //命名空间,可选参数 $server->register( 'hello', //注册的方法 array('user_name'=>'xsd:string','password'=>'xsd:string'),//输入参数的定义 array('return'=>'xsd:string'), // 返回参数的定义 $NAMESPACE); //命名空间,可选参数 $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; //最后一步,把客户端通过 post 方式提交的数据,传递给服务对象的 service 方法。 //service 方法处理输入的数据,调用相应的函数或方法,并且生成正确的反馈,传回给客户端。 $server->service($HTTP_RAW_POST_DATA); //注册方法的实现,有参数 function hello($name, $password) { if ($password == 'lory' && $name == 'lory') { return 'Welcome lory, how are you?'; } else { return 'Go away!!!'; } } //注册方法的实现,无参数 function getName() { return 'lory'; } exit(); ?> 在浏览器中访问服务端文件,可以看到其向外发布的WSDL信息: 点击上图的WSDL链接,会显示该服务器提供的WSDL定义内容, 点击”hello”链接,则打开该方法的定义: 其客户端调用与non-WSDL一样。 2.2 SOAP 扩展实现 使用SOAP扩展,首先配置php.ini: 1、加载 extension=php_soap.dll 及取消前面的分号。 2、修改soap.wsdl_cache_enabled = 1 为soap.wsdl_cache_enabled = 0(该参数提供WSDL文件缓存,在运行环境中设置1,使用缓存;在调试环境中设置为0,不使用缓存)。 修改php.ini后要重启apache服务器。 下面进行一个简单的应用,它只包含一个方法hello(),与前面例子实现的功能相同。 hello():有两个参数$name和$password,如果$name和$password都是“lory”,返回“Welcome lory, how are you?”,如果不是,返回“Go away!!!”。 2.1.1 non-WSDL模式 服务器端:SoapHello1.php 'www.kingdee.com', 'soap_version' => SOAP_1_2)); //注册提供外部调用的方法 $server->addFunction('hello'); //可以注册方法,也可以注册类: //$server->setClass("class name");    $server->handle(); //注册方法的实现 function hello($name, $password) { if ($password == 'lory' && $name == 'lory') { return 'Welcome lory, how are you?'; } else { return 'Go away!!!'; } } exit(); ?> 该实现中没有支持WSDL,因此也无法将服务器提供的接口暴露。在浏览器中访问服务端文件: 客户端soapclient1.php: "http://192.168.69.241/MyPHP/SoapHello1.php?wsdl", 'uri' => "http://www.kingdee.com/")); //调用服务端方法,并打印出返回结果 echo $client->hello('lory','lory'); } catch (SoapFault $fault){ echo "Error: ",$fault->faultcode,", string: ",$fault->faultstring; } exit(); ?> 浏览器访问客户端,结果如下: 2.1.2 WSDL模式 预先生成WSDL文件wsdl/hello.wsdl,该文件可以手写或工具生成(这个WSDL文件实际是由NuSOAP时WSDL模式生成的): 服务器端:SoapHello1.php SOAP_1_2)); //注册提供外部调用的方法 $server->addFunction('hello'); $server->handle(); //注册方法的实现 function hello($name, $password) { if ($password == 'lory' && $name == 'lory') { return 'Welcome lory, how are you?'; } else { return 'Go away!!!'; } } exit(); ?> 在浏览器中访问服务端文件,http://192.168.69.241/MyPHP/SoapHello1.php?wsdl, 可以看到其向外发布的WSDL文件定义信息: 其客户端调用与non-WSDL基本相同,在实例化SoapClient时改为: $client = new SoapClient('http://192.168.69.241/MyPHP/SoapHello1.php?wsdl'); 3. sugarCRM的WebService 3.1 SugarCRM SOAP sugarCRM已经通过NuSOAP实现提供了一些Webservice API供外界调用。这些API可以通过下面地址访问: http://www.example.com/sugar/service/v2/soap.php WSDL描述文件位于: http://www.example.com/sugar/service/v2/soap.php?wsdl (www.example.com替换成实际的地址或域名) 下图是sugarCRM完整的SOAP流程: 4. Java调用PHP WebService 4.1 使用axis Axis运行需要的组件包如下: axis.jar jaxrpc.jar saaj.jar commons-logging.jar commons-discovery.jar wsdl4j.jar log4j.jar 现在就开始以java做为web service客户端,调用PHP提供的web service服务。PHP的web service服务还是用前面的例子。 InvokeFromPHP.java: package com.kingdee.web.php.webserver; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class InvokeFromPHP { public static void main(String[] args) { InvokeFromPHP server = new InvokeFromPHP(); try { server.invokeNoParameter(); server.invokeParameter(); } catch (Exception e) { e.printStackTrace(); } } /** * 调用PHP的webservice服务,没有参数 * @throws Exception 异常 */ public void invokeNoParameter() throws Exception { //远程提供webservice服务的地址 String endpoint = "http://192.168.69.241/Myphp/SoapHello.php?wsdl"; //创建一个服务(service)调用(call) Service service = new Service(); //通过service创建call对象 Call call = (Call)service.createCall(); //设置webservice服务的地址 call.setTargetEndpointAddress(endpoint); //设置调用的方法 call.setOperationName("getName"); call.setUseSOAPAction(true); //设置返回参数的类型 call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); //调用远程方法并返回结果 String result1 = (String)call.invoke(new Object[] {}); System.out.println("Your name is: " + result1); } /** * 调用PHP的webservice服务,有参数 * @throws Exception */ public void invokeParameter() throws Exception { //远程提供webservice服务的地址 String endpoint = "http://192.168.69.241/Myphp/SoapHello1.php?wsdl"; String name = "lory"; String password = "lory"; //创建一个服务(service)调用(call) Service service = new Service(); //通过service创建call对象 Call call = (Call)service.createCall(); //设置webservice服务的地址 call.setTargetEndpointAddress(endpoint); //设置调用的方法 call.setOperationName("hello"); //设置调用的参数及类型 call.addParameter("user_name", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); call.addParameter("password", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); call.setUseSOAPAction(true); //设置返回参数类型 call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); //调用远程方法并返回结果 String result1 = (String)call.invoke(new Object[] {name, password}); System.out.println("The result from PHP Service: " + result1); } } 结果: Your name is: lory The result from PHP Service: Welcome lory, how are you?

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档