PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】


Posted in PHP onDecember 25, 2018

本文实例讲述了PHP中soap用法。分享给大家供大家参考,具体如下:

一、首先要设置服务器环境

修改php.ini

得添加extension=php_soap.dll (加载soap 内置包)

修改soap.wsdl_cache_enabled=1 改为soap.wsdl_cache_enabled=0 这个是soap的缓存,测试的时候最好改为0,上线稳定了改为1

soap有两种模式一种是wsdl,一种是no-wsdl

二、熟悉几个函数

1. SoapServer

SoapServer用于创建php服务器端页面时定义可被调用的函数及返回 响应数据

格式:

$soap = new SoapServer($wsdl,$array);

其中,$wsdl为soap使用得wsdl文件,wsdl是描述Web Service的一种 标准格式,若将$wsdl设置为null,则表示不使用wsdl模式。
$array是 SoapServer的属性信息,是一个数组。
SoapServer对象的addFunction方法是用来声明哪个函数可以被客户端调用, 语法格式如下:

$soap->addFunction($function_name);

其中,$soap是一个SoapServer对象,$function_name是需要被调用的函数名。

SoapServer对象的handle方法用来处理用户输入并调用相应的函数,最后返回 给客户端处理的结果。语法格式如下:

$soap->handle([$soap_request]);

其中,$soap是一个SoapServer对象,$soap_request是一个可选参数,用来表示 用户的请求信息。如果不指定$soap_request,则表示服务器将接收用户的全部 请求。

2. SoapClient

SoapClient用于调用远程服务器上的SoapServer页面,并实现了对相应函数的调用

格式:

$soap = new SoapClient($wsdl,$array);

参数$wsdl和$array与SoapServer相同

SoapClient的方法, 创建语法如下:

$soap->user_function($params);

其中,$soap是一个SoapClient对象,user_function是服务器端要调用的函数,$params 是要传入函数的参数。

3. SoapFault

SoapFault用于生成soap访问过程中可能出现的错误。创建一个soapFault对象的语法格式

格式:

$fault = new SoapFault($faultcode,$faultstring);

其中,$faultcode是用户定义的错误代码,$faultstring是用户自定义的错误信息。soapFault 对象会在服务器端页面出现错误时自动生成,或者通过用户自行创建SoapFault对象时生成。对于 Soap访问时出现的错误,客户端可通过捕捉SoapFalut对象来获得相应的错误信息。 在客户端捕获SoapFault对象后,可以通过下面的代码获得错误代码和错误信息。

$fault->faultcode;//错误代码 
$fault->faultstring;//错误信息

其中,$fault是在前面创建的SoapFault对象。

4. SoapHeader

soapheader用于描述soap的header信息,一般用于认证

/*
 *SoapHeader参数说明如下所示:
 *'http://tempuri.org/'  namespace(命名空间可省略)
 *'MySoapHeader'     SoapHeader头的类名
 *'array(...)'      存放标识身份的字符串参数
 *'true'         是否必须处理该header
*/

格式:

$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);

三、实例

不用wsdl模式的代码

服务端:

//认证服务端
class Test{
  public function auth($a)
  {
    if($a != '123456789'){
      throw new SoapFault('Server', '您无权访问');
    }
  }
  function say()
  {
    return 'Hi11111';
  }
}
$srv = new SoapServer(null, array('uri' => 'http://192.168.0.153/hao'));
$srv->setClass('Test');
$srv->handle();

Test类中auth是认证判断的,这个方法对应客户端soapheader中的方法

客户端:

//加密的客户端
$cli = new SoapClient(null, array('uri' => 'http://192.168.0.153/hao/', 'location' => 'http://192.168.0.153/hao/test.php', 'trace' => true,'encoding'=>'utf-8'));
$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$cli->__setSoapHeaders(array($h));
try {
echo $cli->say();
} catch (Exception $e) {
echo $e->getMessage();
}

soapheader中auth对应服务端auth方法

如果不 认证,可以去掉下面这两行:

$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$cli->__setSoapHeaders(array($h));

wsdl模式

首先先生成wsdl文件,至于怎么生成网站很多

服务端:

//wsdl服务端
Require './server.class.php';
$server = new SoapServer('./server.wsdl');
$server->setClass('Server');
$server->handle();

server.class.php类代码

class Server {
  public function auth($a){
    if($a != '123456789'){
    throw new SoapFault('Server', '您无权访问');
    }
  }
  public function test() {
    return 'you are testing';
  }
}

客户端:

//wsdl文件客户端
$soap = new SoapClient('http://192.168.0.153/hao/server.wsdl'); //如果是远程,那当然写dizzylion.wsdl的URL了。
$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$soap->__setSoapHeaders(array($h));
try {
echo $soap->test();
} catch (Exception $e) {
echo $e->getMessage();
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHPShop存在多个安全漏洞
Oct 09 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
深入解析PHP内存管理之谁动了我的内存
Jun 20 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
微信支付开发订单查询实例
Jul 12 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
php接口实现拖拽排序功能
Apr 23 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
PHP使用SOAP调用API操作示例
Dec 25 #PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 #PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 #PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 #PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 #PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 #PHP
php workerman定时任务的实现代码
Dec 23 #PHP
You might like
用PHP实现验证码功能
2006/10/09 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
让您的菜单不离网站
2006/10/03 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
js实现微信聊天效果
2020/08/09 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
python3抓取中文网页的方法
2015/07/28 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
python里运用私有属性和方法总结
2019/07/08 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
公司新员工的演讲稿注意事项
2014/01/01 职场文书
运动会获奖感言
2014/02/11 职场文书
供用电专业求职信
2014/07/07 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
十佳少年事迹材料
2014/12/25 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
MySQL创建管理KEY分区
2022/04/13 MySQL
Linux安装Docker详细教程
2022/07/07 Servers