在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 daddslashes()和 saddslashes()有哪些区别分析
Oct 26 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
php模板引擎技术简单实现
Mar 15 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
php ajax数据传输和响应方法
Aug 21 PHP
php的lavarel框架中join和orWhere的用法
Dec 28 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操作文件方法问答
2007/03/16 PHP
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
基于python使用tibco ems代码实例
2019/12/20 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
Django实现简单的分页功能
2021/02/22 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
优秀毕业生自荐信
2014/06/10 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
党支部先进事迹材料
2014/12/24 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
何玥事迹观后感
2015/06/16 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
医学会议开幕词
2016/03/03 职场文书
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js
使用scrapy实现增量式爬取方式
2022/06/21 Python