加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webservice 关于PHP的使用

发布时间:2020-12-17 01:18:50 所属栏目:安全 来源:网络整理
导读:许多机构已经采用了Apach和PHP作为他们的Web应用环境。在Web services模式中采用PHP可能看上去可能会比较难。但是事实上,搭配NuSoap,你可以轻松的应用PHP构建SOAP的客户端和服务器端。 为了说明如何应用NuSoap和PHP来构建Web services,我们将举一个简单的

许多机构已经采用了Apach和PHP作为他们的Web应用环境。在Web services模式中采用PHP可能看上去可能会比较难。但是事实上,搭配NuSoap,你可以轻松的应用PHP构建SOAP的客户端和服务器端。

为了说明如何应用NuSoap和PHP来构建Web services,我们将举一个简单的例子。这个例子应用程序由一个PHP Web services的服务器端和客户端组成。他将实现两个功能:颠倒一个字符串字符的顺序,求两个数的和。

PHP SOAP服务器
用PHP和NuSoap来建立SOAP服务器非常容易。基本上,你只要写出你想要暴露给你的Web services的函数,然后用NuSoap去注册它们就可以了。

OK,另外还需要两步才能完成PHP SOAP服务器的建立。首先你还要在你的PHP代码中创建NuSoap对象的一个实例,然后用HTTP POST方法将原始数据传给NuSoap进行处理

NuSOAP 的使用比较简单,其中最常用到的类是soap_server和soapclient,其中soap_server用于创建 Webservice服务,类soapclient则用于调用Webservice .这两个类的定义都在lib/nusoap.php中,因此我们在创建或调用Webservice接口程序时均需要引用该文件.

?

NuSoap 是 PHP 环境下的 WebService 编程工具,用于创建或调用 WebService ,是一个开源软件。它完全采用 PHP 语言编写、通过 HTTP 收发 SOAP 消息的一系列 PHP 类,由 NuSphere Corporation(http://www.nusphere.com/ ) 开发。
它的优势 是不需要扩展库的支持,这种特性使它可用于所有的 PHP 环境,不受服务器安全设置的影响。


1. 首先,去 http://sourceforge.net/projects/nusoap/ 下载 nusoap-0.9.5.zip ,解压后把 lib 文件夹放到与你的 WebService 程序相同的目录,如 /WebService/lib 。2. 服务端:建立 nusoapService.php 文件。<?php??? //客户端:建立 nusoapClient.php 文件。??? date_default_timezone_set('PRC');??? //设置中国时区? 或date_default_timezone_set('Asia/Shanghai');-- Asia 亚洲 Shanghai 上海??? ??? require_once ( "lib/nusoap.php" );??? ??? //初始化客户端对象,这个对象是类 soapclient 的一个实例,??? //把服务程序的 URL 地址传递给soapclient类的构造函数。??? $client? =? new? soapclient( 'http://localhost:93/nusoapService.php');??? ??? // 避免乱码??? $client->soap_defencoding =? 'UTF-8' ;??? $client->decode_utf8 =? false ;??? $client->xml_encoding =? 'UTF-8' ;??? header("Content-Type:text/html;charset=utf-8;");??? ??? // 参数转为数组形式传递??? $paras = array ( 'name' => 'Bruce Lee' );??? ??? // 目标方法没有参数时,可省略后面的参数??? $result = $client->call( 'sayHello',$paras );??? ??? // 参数转为数组形式传递??? $parasWorld = array('World');??? ??? // 目标方法没有参数时,可省略后面的参数??? $resultWorld = $client->call( 'sayWorld',$parasWorld);??? ??? // 检查错误,获取返回值??? if? (! $err = $client->getError()) ??? {? ??? ??? echo? " 返回结果: " . ??? ??? ??? ? '<br/> sayHello -- ' . $result .? ??? ??? ??? ? '<br/> sayWorld -- ' . $resultWorld;?? ??? }??? else? ??? {? ??? ??? echo? " 调用出错: " . $err ; ??? }??? ??? //注: 用 nusoap 实现 WebService,不要开启 php 的 SOAP 扩展??? /*??? NuSoap调用WebService出现乱码的原因:??? ???   通常我们进行WebService开发时都是用的UTF-8编码,这时我们需要设置:??? ??? $client->soap_defencoding = 'utf-8';??? ???   同时,需要让xml以同样的编码方式传递:??? ??? $client->xml_encoding = 'utf-8';??? ???   至此应该是一切正常了才对,但是我们在输出结果的时候,却发现返回的是乱码。??? ???   NuSoap调用WebService出现乱码的解决方法:???   实际上,开启了调试功能的朋友,相信会发现$client->response返回的是正确的结果,为什么$result = $client->call($action,array('parameters' => $param)); 却是乱码呢???? ???   研究过NuSoap代码后我们会发现,当xml_encoding设置为UTF-8时,NuSoap会检测decode_utf8的设置,如果为 true,会执行 PHP 里面的utf8_decode函数,而NuSoap默认为true,因此,我们需要设置:??? ??? $client->soap_defencoding = 'utf-8';??? ??? $client->decode_utf8 = false;??? ??? $client->xml_encoding = 'utf-8';??? */?>3. 客户端:建立 nusoapClient.php 文件。<?php?? ?//服务端:建立 nusoapService.php 文件。?? ?date_default_timezone_set('PRC');?? ??? ?require_once ( "lib/nusoap.php" );?? ??? ?//创建一个新的soap_server对象?? ?$server? =? new? soap_server;?? ??? ?// 避免乱码?? ?$server->soap_defencoding =? 'UTF-8' ;?? ?$server->decode_utf8 =? false ;?? ?$server->xml_encoding =? 'UTF-8' ;?? ?header("Content-Type:text/html;charset=utf-8;");?? ?/**?? ? * [文章中说: 缺少了注册这一步,任何PHP函数都将可以进行远程调用,这将是一个极大的安全隐患。?? ? * 但是我尝试过注册是必须的。?? ? * 而且只有将结果return的函数才能直接声明为远程方法,比如echo()就不行,而strtolower()就可以。]?? ? */?? ?/**?? ? * 调用服务对象的 register 方法注册需要被客户端访问的程序。?? ? * 只有注册过的程序,才能被远程客户端访问到。?? ? */?? ??? ?/**?? ? * 注册需要被客户端访问的程序,允许远程调用的方法?? ? * 类型对应值: bool->"xsd:boolean"??? string->"xsd:string" ?? ? *???? ??? ??? int->"xsd:int"???? float->"xsd:float"?? ? */?? ??? ?$server->register(? 'sayHello',???? // 方法名?? ??? ?array ( "name" => "xsd:string" ),????? // 参数,默认为 "xsd:string"?? ??? ?array ( "return" => "xsd:string" ) ?? ??? ?// 返回值,默认为 "xsd:string"?? ?); ?? ??? ?$server->register( 'sayWorld' );?? ??? /**?? ?*? 供调用的方法?? ?* @param $name?? ?*/?? ?function? sayHello( $name ) {?? ??? ??? ?return? "Hello,? { $name } !" ;?? ?}?? ??? /**?? ?*? 供调用的方法?? ?* @param $name?? ?*/?? ?function? sayWorld( $name ) {?? ??? ??? ??? ?if(is_string($name)) ?? ??? ?{?? ??? ??? ?return? "YES,? { $name } !" ;?? ??? ?}?? ??? ?else ?? ??? ?{?? ??? ??? ?//soap_fault类用于产生错误信息?? ??? ??? ?return new soap_fault('client','','参数类型不正确.');?? ??? ??? ?/**?? ??? ??? ? * soap_fault(faultcode,faultactor,faultstring,faultdetail);?? ??? ??? ? * 上面是错误处理类的构造函数的格式?? ??? ??? ? * faultcode 必须值。可以设置为client或server,来表明错误发生在哪一端。?? ??? ??? ? * faultactor 在NuSOAP中尚未实现。?? ??? ??? ? * faultstring 错误信息。?? ??? ??? ? * faultdetail 详细错误信息。你可以使用XML标记。?? ??? ??? ? *?? ??? ??? ? * 除了构造函数外,soap_fault类还有一个serialize()方法?? ??? ??? ? * 它将错误信息序列化,然后返回一个完整的SOAP报文,范例:?? ??? ??? ? *?? ??? ??? ? * $fault = new soap_fault('client','The inputString parameter must not be empty');?? ??? ??? ? * echo $fault->serialize();?? ??? ??? ? */?? ??? ?}?? ?}?? ??? ?//isset? 检测变量是否设置?? ?$HTTP_RAW_POST_DATA? =? isset ( $HTTP_RAW_POST_DATA ) ?? $HTTP_RAW_POST_DATA? :? '' ;?? ??? ??? ?//最后一步,把客户端通过 post 方式提交的数据,传递给服务对象的 service 方法。 ?? ?//service 方法处理输入的数据,调用相应的函数或方法,并且生成正确的反馈,传回给客户端。?? ?$server->service( $HTTP_RAW_POST_DATA );?? ??? ??? ?/*注:?? ??? ?1. 文件代码不能有任何输出,否则调用时会报类似如下错误: ??? ??????? XML error parsing SOAP payload on line x( 行号 ): Reserved XML Name??????? 2. 要以 UTF-8? 无 BOM 格式保存,不然客户端调用会出错。*/??? ??>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读