在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 相关文章推荐
使用php4加速网络传输
Oct 09 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
Feb 21 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
PHP图片处理类 phpThumb参数用法介绍
Mar 11 PHP
PHP魔术引号所带来的安全问题分析
Jul 15 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
PHP异常处理Exception类
Dec 11 PHP
PHP实现清除MySQL死连接的方法
Jul 23 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
PHP7 foreach() 函数修改
Mar 09 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+DBM的同学录程序(4)
2006/10/09 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
js prototype截取字符串函数
2010/04/01 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
python strip()函数 介绍
2013/05/24 Python
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python实现微信远程控制电脑
2018/02/22 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
python scatter函数用法实例详解
2020/02/11 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
毕业实习评语
2014/02/10 职场文书
动员大会主持词
2014/03/20 职场文书
城管综合整治方案
2014/05/01 职场文书
语文高效课堂实施方案
2014/05/03 职场文书
高中教师个人工作总结
2015/02/10 职场文书
拖欠货款起诉状
2015/05/20 职场文书
教师考核鉴定意见
2015/06/05 职场文书
高一英语教学反思
2016/03/03 职场文书
民事纠纷协议书
2016/03/23 职场文书