应用NuSoap和PHP来构建Web services(代码测试未成功,以后学习)
2013-08-17 10:01
344 查看
许多机构已经采用了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 格式保存,不然客户端调用会出错。*/
?>
例2:(成功)
<?php
require_once("lib/nusoap.php");
functionhello($word){
return'Hello,'.$word;
}
$server =new soap_server;
$server->register('hello');
$HTTP_RAW_POST_DATA =isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:'';
$server->service($HTTP_RAW_POST_DATA);
?>
建立client.php,位置http://localhost/soapserver/client.php
<?php
require_once("lib/nusoap.php");
$client =new nusoap_client("http://localhost/nusoap/server.php");
$data =array('word' => "fuck");
$err =$client->getError();
if ($err){
// Displaythe error
echo'<p><b>Constructorerror: ' . $err .'</b></p>';
// At thispoint, you know the call that follows will fail
}
$return =$client->call('hello',$data);
print_r($return);
?>
为了说明如何应用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 格式保存,不然客户端调用会出错。*/
?>
例2:(成功)
<?php
require_once("lib/nusoap.php");
functionhello($word){
return'Hello,'.$word;
}
$server =new soap_server;
$server->register('hello');
$HTTP_RAW_POST_DATA =isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:'';
$server->service($HTTP_RAW_POST_DATA);
?>
建立client.php,位置http://localhost/soapserver/client.php
<?php
require_once("lib/nusoap.php");
$client =new nusoap_client("http://localhost/nusoap/server.php");
$data =array('word' => "fuck");
$err =$client->getError();
if ($err){
// Displaythe error
echo'<p><b>Constructorerror: ' . $err .'</b></p>';
// At thispoint, you know the call that follows will fail
}
$return =$client->call('hello',$data);
print_r($return);
?>
相关文章推荐
- 应用NuSoap构建新型的基于PHP的Web服务
- 学习PHP精粹,编写高效PHP代码之自动测试
- 测试PHP连接MYSQL成功与否的代码
- phpwind代码分析之global.php简单说明(主要学习php基础知识的应用)
- 测试php连接mysql是否成功的代码分享
- 测试PHP连接MYSQL成功与否的代码
- 测试PHP连接MYSQL成功与否的代码
- 测试php连接mysql是否成功的代码分享
- Java学习笔记之面向对象测试代码
- PHP var_dump遍历对象属性的函数与应用代码
- PHP安全学习与进阶—PHP 项目代码安全总结
- 华为软件编程规范学习(十一)--代码测试、维护
- Windows phone 应用开发[11]-Pex 构建自动化白盒测试[上] 推荐
- 学习PHP精粹,编写高效PHP代码之质量保证
- [Share]构建成功web应用的十项黄金法则
- 网页上记录鼠标的点击次数和一段有用的php代码,自己学习使用
- php学习笔记1——使用phpStudy进行php运行环境搭建与测试。
- SWT实例学习代码例子 -- 学好swt,色色就可以写桌面应用了
- 破解图片防盗链的代码(asp/php)测试通过
- 我的编程学习日志(4)-- 一种简单的测试代码的方法(freopen)