在PHP中利用wsdl创建标准webservice的实现代码


Posted in PHP onDecember 07, 2011

1、创建wsdl
说明:
A、非标准的webservice,可能只能PHP才能访问
B、标准的webservice,就必须要使用wsdl(webservice description language,就是用XML语法标准来描述你的服务内容,我是这么理解的)
在这里我只介绍标准的webservice。
那么如何创建wsdl呢?对于PHP来说这确实是件很不容易的事情,有人说用zend studio创建很方便,这是一种方法。但对于那些不喜欢用zend studio的人来说,会觉得创建一个webservice还要安装zend studio,太强人所难了,我就是,嘿嘿。
在这里我介绍一个简单的方法,到网上下载SoapDiscovery.class.php类,里面有个公用方法:getWSDL,这个方法末尾是用的return,那么,你修改一下这个方法,我是这么做的:
//return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');
//生成wsdl文件,将上面的return注释
$fso = fopen($this->class_name . ".wsdl" , "w");
fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'));
现在生成wsdl的类有了,SoapDiscovery.class.php★。

我只要再准备一个提供服务的类或者函数就可以创建wsdl了
比如我有个类:person,文件名为:person.class.php★,里面有两个方法,一个是say,一个是run。很简单。

<?php 
class person 
{ 
public function say() 
{ 
return("i'm speaking."); 
} 
public function run() 
{ 
return("i'm running,don't disturb me please."); 
} 
} 
?>

到这里有两个类了:SoapDiscovery.class.php和person.class.php。
开始正式生成wsdl:
创建文件server.php。将以下内容拷贝进去,运行即可生成一个person.wsdl文件
<?php 
include("person.class.php"); 
include("SoapDiscovery.class.php"); $disco = new SoapDiscovery('person','Person');//第一个参数是类名(生成的wsdl文件就是以它来命名的),即person类,第二个参数是服务的名字(这个可以随便写)。 
$disco->getWSDL(); 
?>

2、创建webservice服务端程序
将server.php文件的内容清空,复制以下代码进去:
<?php 
include("person.class.php"); 
$objSoapServer = new SoapServer("person.wsdl");//person.wsdl是刚创建的wsdl文件 
//$objSoapServer = new SoapServer("server.php?wsdl");//这样也行 
$objSoapServer->setClass("person");//注册person类的所有方法 
$objSoapServer->handle();//处理请求 
?>

3、创建webservice客户端程序,测试webservice是否有效,文件名是:client.php
将以下内容拷贝进去
<?php 
$client = new SoapClient("person.wsdl"); 
//$client = new SoapClient("server.php?wsdl");//这样也行 
echo($client->say()); 
echo "<br />"; 
echo($client->run()); 
echo "<br />"; 
?>

OK,结束。很简单吧?
.NET如果要使用的话,你只要提供一个url给他就行了。
获得url的方法:你可以先到person.wsdl文件里面查找<soap:address location="http://xxxxxxxxxxxxxxxxxxxx/server.php" />,这里的url(具体url是根据你的目录确定的)就是你要提供给.NET开发人员使用的。不过别高兴太早,后面要加:“?wsdl”,http://xxxxxxxxxxxxxxxxxxxx/server.php?wsdl这样才是对的,不信你可以将url拷贝到浏览器的地址栏里看下就知道了。
.NET开发人员获得你给他的url之后,就可以在自己的项目里面添加一个服务引用或者web引用了,然后就可以根据提示完成相关操作,对于使用.NET的开发人员来说很简单的。

在这里我只介绍标准的webservice
一、 创建WSDL
1。网上下载SoapDiscovery.class.php类
2。修改SoapDiscovery.class.php的公共方法getWsdl(),让其自动生成wsdl文件(注意存放路径),这里只是创建一个wsdl模型

//return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'); 
//生成wsdl文件,将上面的return注释 
$fso = fopen($this->class_name . ".wsdl" , "w"); 
fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>')); 
exit;

3。提供服务的类或者函数
//比如我有个类:person,文件名为:person.class.php★,里面有两个方法,一个是say,一个是run。很简单。 
<?php 
class person 
{ 
public function say() 
{ 
return("i'm speaking."); 
} 
public function run() 
{ 
return("i'm running,don't disturb me please."); 
} 
} 
?>

4。开始正式生成wsdl:
创建文件server.php。将以下内容拷贝进去,运行即可生成一个person.wsdl文件
<?php 
include("person.class.php"); 
include("SoapDiscovery.class.php"); 
//第一个参数是类名(生成的wsdl文件就是以它来命名的),即person类,第二个参数是服务的名字(这个可以随便写)。 
$disco = new SoapDiscovery('person','Person'); 
$disco->getWSDL(); 
?>

5。创建webservice服务端程序
将server.php文件的内容清空,复制以下代码进去:
<?php 
include("person.class.php"); 
$objSoapServer = new SoapServer("person.wsdl");//person.wsdl是刚创建的wsdl文件 
//$objSoapServer = new SoapServer("server.php?wsdl");//这样也行 
$objSoapServer->setClass("person");//注册person类的所有方法 
$objSoapServer->handle();//处理请求 
?>

6。创建webservice客户端程序,测试webservice是否有效,文件名是:client.php
<?php 
$client = new SoapClient("person.wsdl"); 
//$client = new SoapClient("server.php?wsdl");//这样也行 
echo($client->say()); 
echo "<br />"; 
echo($client->run()); 
echo "<br />"; 
?>

7。.NET如果要使用的话,你只要提供一个url给他就行了。
获得url的方法:你可以先到person.wsdl文件里面查找<soap:address location="http://xxxxxxxxxxxxxxxxxxxx/server.php" />,这里的url(具体url是根据你的目录确定的)就是你要提供给.NET开发人员使用的。不过别高兴太早,后面要加:“?wsdl”,http://xxxxxxxxxxxxxxxxxxxx/server.php?wsdl这样才是对的,不信你可以将url拷贝到浏览器的地址栏里看下就知道了。
.NET开发人员获得你给他的url之后,就可以在自己的项目里面添加一个服务引用或者web引用了,然后就可以根据提示完成相关操作,对于使用.NET的开发人员来说很简单的。

(1)创建一网站,创建一个web引用,输入url

(2)实力调用

protected void Page_Load(object sender, EventArgs e) 
{ 
if (!IsPostBack) { 
sdaf.Solsoft_HelloWorld ddd = new sdaf.Solsoft_HelloWorld(); 
Label1.Text = ddd.say(); 
} 
}

测试代码http://xiazai.3water.com/201112/yuanma/CreateSoap.rar
PHP 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
phpfans留言版用到的数据操作类和分页类
Jan 04 PHP
php smarty 二级分类代码和模版循环例子
Jun 01 PHP
PHP函数之日期时间函数date()使用详解
Sep 09 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
PHPTree――php快速生成无限级分类
Mar 30 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 PHP
浅谈PHP进程管理
Mar 08 PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 PHP
PHP新手NOTICE错误常见解决方法
Dec 07 #PHP
PHPExcel读取Excel文件的实现代码
Dec 06 #PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 #PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 #PHP
PHP中文件缓存转内存缓存的方法
Dec 06 #PHP
php urlencode()与urldecode()函数字符编码原理详解
Dec 06 #PHP
PHP中实现中文字符进制转换原理分析
Dec 06 #PHP
You might like
十天学会php之第八天
2006/10/09 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
js判断两个日期是否相等的方法
2013/09/10 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
2016/05/10 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
简单谈谈python基本数据类型
2018/09/26 Python
Python类的继承用法示例
2019/01/31 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
python属于跨平台语言码
2020/06/09 Python
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
企划专员岗位职责
2013/12/09 职场文书
网络技术专业推荐信
2014/02/20 职场文书
少先队活动总结
2014/08/29 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
体育教师教学随笔
2015/08/15 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
Python绘制分类图的方法
2021/04/20 Python
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB