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版(2)
Oct 09 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
使用php实现截取指定长度
Aug 06 PHP
php中通过curl检测页面是否被百度收录
Sep 27 PHP
php构造函数实例讲解
Nov 13 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 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 !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
python机器学习之贝叶斯分类
2018/03/26 Python
python如何实现数据的线性拟合
2019/07/19 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
python 函数中的参数类型
2020/02/11 Python
python用什么编辑器进行项目开发
2020/06/17 Python
Python 在局部变量域中执行代码
2020/08/07 Python
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
Delphi软件工程师试题
2013/01/29 面试题
服务标语口号
2014/07/01 职场文书
迎新生欢迎词
2015/01/23 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
微观世界观后感
2015/06/10 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
Python读取和写入Excel数据
2022/04/20 Python
box-shadow单边阴影的实现
2023/05/21 HTML / CSS