在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 相关文章推荐
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
Jun 07 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
PHP缓冲区用法总结
Feb 14 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
php中pcntl_fork创建子进程的方法实例
Mar 14 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
Mar 14 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
Yii框架安装简明教程
May 15 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
Aug 06 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 post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
执行iframe中的javascript方法
2008/10/07 Javascript
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
python集合类型用法分析
2015/04/08 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
大学生的应聘自我评价
2013/12/13 职场文书
干部行政关系介绍信
2014/01/17 职场文书
捐款倡议书
2014/04/14 职场文书
小学生期末评语大全
2014/04/21 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
2014年销售部工作总结
2014/12/01 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
单位政审意见范文
2015/06/04 职场文书
投诉书范文
2015/07/02 职场文书
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫