欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何提供一个web service给别人吧server.php

上回提到了如何使用php去呼叫别人提供的web service 
这回我们来看看如何提供一个web service给别人吧server.php


程式码:

<?php 
class HelloServise 

 //$__dispatch_map用来定义这个hello function输出以及输入的参数型态
 var $__dispatch_map = array(); 
 function HelloServise() 
 { 
   //我们在constructor这边指定好Hello这个函数Input的参数只有一个
   //名称叫input型态是string 
  //传回值是一个string型态的值
   $this->__dispatch_map['Hello'] = 
   array('in' => array('input' => ' string'), 
         'out' => array('output' => 'string'), 
       ); 
 } 
 function Hello($input) 
 { 
  return "Hello:[$input]"; 
 } 

require_once 'SOAP/Server.php '; 
require_once 'SOAP/Disco.php'; 
//产生一个SOAP Server物件
$server = new SOAP_Server; 
//产生一个我们要提供的web service物件
$Hello = new HelloServise(); 
//向SOAP Server注册我们提供的Web Service名称叫HelloService 
$server->addObjectMap($Hello,'urn:HelloService'); 
//因为我们取得Client送过来的xml是用POST方式
//所以我们检查如果送过来的资料是用POST送过来的
//就直接交给SOAP Server去做处理
if ($_SERVER['REQUEST_METHOD']=='POST') 
 $server->service($HTTP_RAW_POST_DATA); 
else 

 //产生一个discover物件
 //用来产生wsdl 
 $disco = new SOAP_DISCO_Server($server,'HelloServise'); 
 //设定输出文件为xml格式
 header("Content-type: text/xml"); 
 //如果client呼叫的时候是xxx.php? wsdl 
 //就呼叫getWSDL()传回wsdl格式的XML 
 //否则就送回正确取得wsdl方式的XML 
 if($_SERVER['QUERY_STRING']=='wsdl') echo $disco->getWSDL(); 
 else echo $disco->getDISCO(); 

?>

我们来测试一下刚刚写好的HelloService 
client.php
程式码:

<?php 
 require_once("SOAP/Client.php"); 
 $wsdl=new SOAP_WSDL('http://yourhost/server.php?wsdl'); 
 $helloClient = $wsdl->getProxy(); 
 echo $helloClient- >Hello("This is a test!"); 
?>

输出
程式码:

Hello:[This is a test!]

是不是很简单呢
此外这边在补充一点
WSDL跟SOAP的关系
wsdl是用来描述你提供了哪些web service 
用个简单的说法就是
wsdl就是一个定义档
定义你提供的物件
SOAP才是真正处理输入以及输出xml的主角
 
  已记录

我的symfony作品: YOMOpets宠物志
有兴趣可以一起来讨论symfony喔
我的部落格: http://pets.yomopets.com/ricky
yahssu
可爱的小学生文章: 2
*



检视个人资料
« 回覆文章#1于: 2009-01-08 22:35 »
 

  奸笑 ricky:
          你介绍的services用php来做是不错啦,只是程式中HelloServise()后面()是做什么的,能不能请你解释一下,我太想知道了!充满了问号!
                                                              啥 啥
 
  已记录
阳だまり
怀疑的国中生会员性别: 文章: 49
**
男



阳だまり


检视个人资料
« 回覆文章#2于: 2009-01-09 00:34 »
 

(是( 
)是) 
:是: 小弟还以为只有我会有这种情况 

啥
 
  已记录
ricky
区域板主
钻研的研究生文章: 605
*****




检视个人资料 个人网站
« 回覆文章#3于: 2009-01-09 09:35 »
 

这篇是以前系统还是phpbb时po的
可是移转到到现在的SMF后
有些旧文章就变成现在的模样
有时候自己来挖一些东西时也挺头痛的 看有没有善心人士能改写一下code str_replce一下吧啥
奸笑
 
  已记录

我的symfony作品: YOMOpets宠物志
有兴趣可以一起来讨论symfony喔
我的部落格: http://pets.yomopets.com/ricky
micmic3
俺是博士!文章: 1486
*****



检视个人资料
« 回覆文章#4于: 2009-01-09 09:42 »
 

new SOAP_WSDL('http://yourhost/server.php?wsdl'); 
丢进google 
new SOAP_WSDL(' http://yourhost/server.php?wsdl');
-- 
刚试过整个丢进google translate他会全部改好英文to英文就好了啊应该是有用decodeURIComponentㄏㄏㄏ


程式码:
<?php 
class HelloServise 

//$__dispatch_map用来定义这个hello function输出以及输入的参数型态
var $__dispatch_map = array(); 
function HelloServise() 

//我们在constructor这边指定好Hello这个函数Input的参数只有一个
//名称叫input型态是string 
//传回值是一个string型态的值
$this->__dispatch_map['Hello'] = 
array('in' => array('input' => ' string'), 
'out' => array('output' => 'string'), 
); 

function Hello($input) 

return "Hello:[$input]"; 


require_once 'SOAP/Server.php '; 
require_once 'SOAP/Disco.php'; 
//产生一个SOAP Server物件
$server = new SOAP_Server; 
//产生一个我们要提供的web service物件
$Hello = new HelloServise(); 
//向SOAP Server注册我们提供的Web Service名称叫HelloService 
$server->addObjectMap($Hello,'urn:HelloService'); 
//因为我们取得Client送过来的xml是用POST方式
//所以我们检查如果送过来的资料是用POST送过来的
//就直接交给SOAP Server去做处理
if ($_SERVER['REQUEST_METHOD']=='POST') 
$server->service($HTTP_RAW_POST_DATA); 
else 

//产生一个discover物件
//用来产生wsdl 
$disco = new SOAP_DISCO_Server($server,'HelloServise'); 
//设定输出文件为xml格式
header("Content-type: text/xml"); 
//如果client呼叫的时候是xxx.php? wsdl 
//就呼叫getWSDL()传回wsdl格式的XML 
//否则就送回正确取得wsdl方式的XML 
if($_SERVER['QUERY_STRING']=='wsdl') echo $disco->getWSDL(); 
else echo $disco->getDISCO(); 

?> <?php require_once("SOAP/Client.php"); $wsdl=new SOAP_WSDL('http://yourhost/server.php?wsdl'); $helloClient = $wsdl->getProxy(); echo $helloClient->Hello("This is a test!"); ?>






 
 
« 最后编辑时间: 2009-01-09 09:52由micmic3 » 已记录
twu2
酷!学园学长们
俺是博士!会员性别: 文章: 4811
*****
男


 


检视个人资料 个人网站
« 回覆文章#5于: 2009-01-09 09:43 »
 

新存的并不会有问题,所以应该不是code的功能造成的. 
也许是当初资料库由phpbb转到smf时的结果吧.可以要善心人士写个程式去逐笔转换回来吧.
 
  已记录

Darkhero
酷!学园学长们
俺是博士!会员性别: 文章: 3557
*****
男



我家小猫~


检视个人资料 个人网站
« 回覆文章#6于: 2009-01-09 13:46 »
 

那...我来..想个办法吧...Orz...
 
  已记录

希望我们的讨论是为了把问题解决,而不是争论谁对谁错. 
『灌水才是重点,发文只是顺便』
『我宁可让不会钓鱼的工程师饿死,也不想让会饿死的工程师去搅沉公司....』
ricky
区域板主
钻研的研究生文章: 605
*****




检视个人资料 个人网站
« 回覆文章#7于: 2009-01-09 16:35 »
 

我原本是想说
当资料要输出到样板前
先用str_replace处理过
把资料转回原本的样子(没问题的资料还是没问题,有问题的资料就会被转成对的) 
就不用直接去读写资料库
这样风险比较小一些 奸笑
 
  已记录

我的symfony作品: YOMOpets宠物志
有兴趣可以一起来讨论symfony喔
我的部落格: http://pets.yomopets.com/ricky

普通分类: