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 相关文章推荐
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
PHP5多态性与动态绑定介绍
Apr 03 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
[原创]php简单隔行变色功能实现代码
Jul 09 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
php layui实现前端多图上传实例
Jul 30 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 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
咖啡语言
2021/03/03 咖啡文化
PHP之变量、常量学习笔记
2008/03/27 PHP
PHP 程序员应该使用的10个组件
2009/10/31 PHP
php绘制圆形的方法
2015/01/24 PHP
php socket通信简单实现
2016/11/18 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
php实现微信支付之现金红包
2018/05/30 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
xml和web特殊字符
2009/04/28 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
python3 shelve模块的详解
2017/07/08 Python
基于python实现KNN分类算法
2020/04/23 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
2014年消防工作实施方案
2014/02/20 职场文书
企业指导教师评语
2014/04/28 职场文书
趣味运动会标语口号
2015/12/26 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python
spring boot中nativeQuery的用法
2021/07/26 Java/Android