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 相关文章推荐
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
解析PHP 使用curl提交json格式数据
Jun 29 PHP
mac下Apache + MySql + PHP搭建网站开发环境
Jun 02 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
PHP常用编译参数中文说明
Sep 27 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
Yii视图操作之自定义分页实现方法
Jul 14 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
PHP实现的AES 128位加密算法示例
Sep 16 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 得到根目录的 __FILE__ 常量
2008/07/23 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
python 魔法函数实例及解析
2019/09/25 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
行政内勤岗位职责
2014/04/07 职场文书
超市开店计划书
2014/09/15 职场文书
公司会议开幕词
2016/03/03 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python