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
用session做客户验证时的注意事项
Oct 09 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
分享最受欢迎的5款PHP框架
Nov 27 PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
深入理解PHP变量的值类型和引用类型
Oct 21 PHP
thinkPHP下的widget扩展用法实例分析
Dec 26 PHP
php基于PDO连接MSSQL示例DEMO
Jul 13 PHP
php基于websocket搭建简易聊天室实践
Oct 24 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 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
wordpress之wp-settings.php
2007/08/17 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
一个实用的php验证码类
2017/07/06 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
js Dialog 实践分享
2012/10/22 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
Python机器学习之SVM支持向量机
2017/12/27 Python
Python随机函数random()使用方法小结
2018/04/29 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
python利用tkinter实现屏保
2019/07/30 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
详解Python yaml模块
2020/09/23 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
幼儿园毕业教师感言
2014/02/21 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
新闻编辑求职信
2014/07/13 职场文书
自主招生学校推荐信
2014/09/26 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
python tkinter模块的简单使用
2021/04/07 Python
解析MySQL索引的作用
2022/03/03 MySQL