phpnusoap类的使⽤、⽤法、出错及说明
NuSOAP 是 PHP 环境下的 WEB 服务编程⼯具,⽤于创建或调⽤ WEB 服务它是⼀个开源软件,当前版本是 0.7.2 ,⽀
持 SOAP1.1 WSDL1.1 ,可以与其他⽀持 SOAP1.1 和 WSDL1.1 的系统互操作 NuSOAP 完全由PHP语⾔编写,由⼀系列 PHP 类组成,不需要扩展库的⽀持,这种特性使得 NuSOAP 可以⽤于所有的 PHP 环境,不受服务器安全设置的影响
2. NuSOAP 的使⽤
NuSOAP 由⼀ PHP 的类组成,其中最常⽤到的是类soap_server和类soalclient类soap_server ⽤于创建 WEB 服务,类soapclient在访问WEB服务时会⽤到
2.1 ⼀个简单的例⼦: Hello World
这个例⼦将利⽤ NuSOAP 创建⼀个简单的 WEB 服务,并利⽤ NuSOAP 创建⼀个客户端程序,调⽤这个服务这个服务唯⼀的功能就是向客户端返回⼀个字符串 Hello World ⾸先,创建 WEB 服务程序代码⽂件 /nusoap/nusoap_server1.php :
//把 NuSOAP 的源⽂件包含到当前的代码⽂件⾥
<?php
require_once("lib/nusoap.php");
//定义服务程序
function hello() {
return 'Hello World!';
}
//初始化服务对象 , 这个对象是类 soap_server 的⼀个实例
$soap = new soap_server; //调⽤服务对象的 register ⽅法注册需要被客户端访问的程序
//只有注册过的程序,才能被远程客户端访问到
$soap->register('hello'); //最后⼀步,把客户端通过 post ⽅式提交的数据,传递给服务对象的 service ⽅法
//service ⽅法处理输⼊的数据,调⽤相应的函数或⽅法,并且⽣成正确的反馈,传回给客户端
$soap->service($HTTP_RAW_POST_DATA);
> ⾄此, WEB 服务程序代码⽂件已经建好,接下来,创建⼀个客户端程序代码⽂件 /nusoap/nusoap_client1.php ,调⽤ WEB 服务:
//把 NuSOAP 的源⽂件包含到当前的代码⽂件⾥
<?php
require_once("lib/nusoap.php");
//初始化客户端对象,这个对象是类 soapclient 的⼀个实例,
//把服务程序的 URL 地址传递给soapclient类的构造函数
$client = new soapclient('127.0.0.1/nusoap/nusoap_server1.php'); //利⽤客户端对象的 call ⽅法调⽤ WEB 服务的程序
$str=$client->call('hello'); //客户端对象的 getError() ⽅法可以⽤来检查调⽤过程是否出现错误
//如果没有错误, getError() ⽅法返回 false ;如果有错误, getError()⽅法返回错误信息
if (!$err=$client->getError()) {
echo " 程序返回 :",htmlentities($str,ENT_QUOTES);
} else {
echo " 错误 :",htmlentities($err,ENT_QUOTES);
}
> ⾄此,客户端程序也建⽴好了,打开浏览器,访问客户端程序,看⼀下结果这个例⼦,浏览器会显⽰字符串:程序返回 :Hello World! 2.2 传递参数和返回错误信息的⽅法
再通过例⼦说明传递参数和返回错误信息的⽅法这个例⼦实现两个字符串的连接,参数是两个字符串,返回值是由两个参数连接⽽成的字符串⾸先,创建服务程序代码⽂件 /nusoap/nusoap_server2.php ,完整的代码如下:
<?php
require_once("lib/nusoap.php");
function concatenate($str1,$str2) {
if (is_string($str1) && is_string($str2))
return $str1 . $str2;
else
return new soap_fault(' 客户端 ','','concatenate 函数的参数应该是两个字符串 ');
}
$soap = new soap_server;
$soap->register('concatenate');
$soap->service($HTTP_RAW_POST_DATA);
> 与 2.1 节 WEB 服务程序的代码⽐较,这⾥的代码结构⼤体是相同的注意以下两点:
服务程序的定义不同,带有两个参数 NuSOAP 注册服务程序的过程还是⼀样的,都是调⽤服务对象的 register ⽅法
这⾥使⽤了 NuSOAP 的⼀个新类 soap_fault 当传⼊的两个参数有⼀个不是字符串时,程序通过这个类把错误信息返回给客户端这个类的构造函数有 4 个参数:
fault
code
必填参数 , 建议值为 Client 或 Server ,指明错误是客户端的错误还是服务端的错误
faultactor
预留项,现在还没有使⽤
faultstring
错误的描述信息
faultdetail
可选项, XML 格式的数据 , 说明详细的错误信息
客户端程序代码⽂件 /nusoap/nusoap_client2.php 的完整内容如下 :
<?php
require_once("lib/nusoap.php");
$client = new soapclient('127.0.0.1/nusoap/nusoap_server2.php');
$parameters=array(' 字符串 1',' 字符串 2');
$str=$client->call('concatenate',$parameters);
if (!$err=$client->getError()) {
echo " 程序返回 :",$str;
} else {
echo " 错误 :",$err;
}
> NuSOAP 的客户端调⽤带参数的 WEB 服务时,使⽤数组传递参数 $parameters 是⼀个数组,其中
依次是每个参数的值客户端在调⽤远程的服务程序时,使⽤带有两个参数的 call ⽅法,第⼀个参数是服务程序的名称,第⼆个参数是服务程序的参数数组,这⾥
是 $parameters 通过浏览器访问上⾯的客户端程序,浏览器上会显⽰字符串:程序返回 : 字符串 1 字符串 2
接下来,试着给 WEB 服务程序传⼊错误参数,修改上⾯的客户端程序,把⽣成参数数组的语句改成: $parameters=array( 字符串 ,12) ,再通过浏览器访问客户端程序,浏览器上会显⽰字符串:错误 : 客户端 : concatenate 函数的参数应该是两个字符串 WEB 服务程序判断传⼊的参数有⼀个不是字符串,通过 soap_fault 给客户端返回错误信息
2.3 调试的⽅法
NuSOAP中常⽤的调试⽅法有三种:
2.3.1 soapclient 类的 request 和 response 成员变量
最直接的调试⽅法就是检查访问 WEB 服务的过程中,客户端发出的 request 信息和服务端返回的 response 信息 soapclient 类
的 request 和 response 成员变量包含这些信息,在程序中显⽰出这两个变量的内容,可以帮助分析程序运⾏的情况看下⾯的代码:
<?php
require_once("lib/nusoap.php");
$client = new soapclient('127.0.0.1/nusoap/nusoap_server2.php');
$parameters=array(' 字符串 1',' 字符串 2');
$str=$client->call('concatenate',$parameters);
if (!$err=$client->getError()) {
echo " 程序返回 :",$str;
} else {
echo " 错误 :",$err;
}
//下⾯显⽰request和response 变量的内容
echo '<p/>';
echo 'Request:';
echo '<pre>',htmlspecialchars($client->request,ENT_QUOTES),'</pre>';
echo 'Response:';
echo '<pre>',htmlspecialchars($client->response,ENT_QUOTES ),'</pre>';
>
2.3.2 soapclient 类的 debug_str 成员变量
soapclient 类的 debug_str 成员变量提供了更为详细的调试信息,查看这个变量的内容,可以更好地帮助程序调试.
2.3.3 WEB 服务程序提供的调试⽅法
WEB 服务程序代码中,在创建 soap_server 类的实例前,定义变量 $debug=1 调试信息作为备注,放在 SOAP 消息的尾部返回客户端,客户端通过查看 WEB 服务的 response 信息来查看调试信息
<?php
require_once("lib/nusoap.php");
function concatenate($str1,$str2) {
if (is_string($str1) && is_string($str2))
return $str1 . $str2;
else
return new soap_fault(' 客户端 ','','concatenate 函数的参数应该是两个字符串 ');
}
$debug=1; //定义调试
$soap = new soap_server;
$soap->register('concatenate');
$soap->service($HTTP_RAW_POST_DATA);
>
2.4 对 WSDL 的⽀持
NuSOAP 内部通过类 "WSDL" 实现对 WSDL 的⽀持对于 NuSOAP 的⽤户来说,不需要关⼼内部的WSDL类是如何⼯作的,正确地使
⽤ soap_server 类和 soapclient 类就可以实现对 WSDL 的⽀持
2.4.2 通过 WSDL 调⽤ WEB 服务
通过 WSDL 调⽤ WEB 服务,与不通过 WSDL 调⽤ WEB 服务,程序的结构⼤体相同区别在于,通过 WSDL 调⽤ WEB 服务,初始
化 soapclient 类时,传⼊两个参数到 soapclient 的构造函数,第⼀个参数是 WSDL ⽂件的地址,第⼆个参数指定是否使⽤ WSDL ,指定为 true 即可看下⾯的代码,代码的⽂件名是 /nusoap/nusoap_client3.php
<?php
require_once("lib/nusoap.php");
$client = new soapclient('127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);
$parameters=array(' 字符串 1',' 字符串 2');
$str=$client->call('concatenate',$parameters);
if (!$err=$client->getError()) {
echo " 程序返回 :",$str;
} else {
echo " 错误 :",$err;
}
>
2.4.3 代理的使⽤
NuSOAP 提供代理的⽅法调⽤远程 WEB 服务这种⽅法,在客户端程序⾥⾯创建⼀个远程服务的代理对象,通过代理直接调⽤远程
的 WEB 服务,⽽不需要通过 soalclient 类的 call ⽅法看下⾯的代码
<?php
require_once("lib/nusoap.php");
$client = new soapclient('127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);
//nusoap_client 的参数: endpoint 端点(url) $wsdl = false判断url($endpoint)是否为wsdl⽂件 proxyhost代理主机 proxyport代理端
⼝ proxyusername 代理⽤户名 proxypassword代理⽤户密码
$proxy=$client -> getProxy(); // 创建代理对象 (soap_proxy 类 )
php的工作流程$str=$proxy->concatenate(" 参数 1"," 参数 2"); // 直接调⽤ WEB 服务
if (!$err=$proxy->getError()) {
echo " 程序返回 :",$str;
} else {
echo " 错误 :",$err;
}
>
对于nusoap出错解决⽅法:⼀般的问题都出在与PHP内置的soap类相冲突,解决⽅法有两个,⼀是不加载PHP的soap扩展;⼆是修改nusoap类中的SoapClient类名。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论