在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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
PHP原生函数一定好吗?
Dec 08 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
Sep 30 PHP
PHP面向对象程序设计之类与反射API详解
Dec 02 PHP
利用php生成验证码
Feb 23 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 PHP
php curl发送请求实例方法
Aug 01 PHP
关于laravel框架中的常用目录路径函数
Oct 23 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 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
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
js加解密 脚本解密
2008/02/22 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
细说webpack6 Babel的使用详解
2019/09/26 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
Python实现统计文本文件字数的方法
2017/05/05 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
python列表的逆序遍历实现
2020/04/20 Python
浅析Python面向对象编程
2020/07/10 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
出纳岗位职责模板
2013/11/27 职场文书
省级四好少年事迹材料
2014/01/25 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
会议接待欢迎标语
2014/10/08 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书