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 相关文章推荐
PHP脚本数据库功能详解(下)
Oct 09 PHP
php中处理模拟rewrite 效果
Dec 09 PHP
php中Array2xml类实现数组转化成XML实例
Dec 08 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
php基于PDO连接MSSQL示例DEMO
Jul 13 PHP
php fread读取文件注意事项
Sep 24 PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
Mar 31 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
Oct 09 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页面间传递参数实例代码
2008/06/05 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
详解package.json版本号规则
2019/08/01 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
Python多线程编程简单介绍
2015/04/13 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
在python shell中运行python文件的实现
2019/12/21 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
课改先进个人汇报材料
2014/01/26 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
小学班主任评语大全
2014/04/23 职场文书
社区戒毒工作方案
2014/06/04 职场文书
骨干教师事迹材料
2014/12/17 职场文书
研究生导师评语
2014/12/31 职场文书
2015年统战工作总结
2015/05/19 职场文书
大学生实习证明
2015/06/16 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书