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 多进程 解决难题
Jun 22 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php中json_decode()和json_encode()的使用方法
Jun 04 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
php-redis中的sort排序函数总结
Jul 08 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
如何判断微信付款码和支付宝付款码
Apr 01 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生成WAP页面
2006/10/09 PHP
php防注
2007/01/15 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
javascript String 的扩展方法集合
2008/06/01 Javascript
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
从零学Python之入门(三)序列
2014/05/25 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
详解Python中的正则表达式
2018/07/08 Python
分析python请求数据
2018/08/19 Python
python贪吃蛇游戏代码
2020/04/18 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
化工专业个人的求职信范文
2013/11/28 职场文书
总经理秘书的岗位职责
2013/12/27 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
redis三种高可用方式部署的实现
2021/05/11 Redis
python迷宫问题深度优先遍历实例
2021/06/20 Python
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis