PHP WebService最常用的两种方法

方法1:  

【IT168 技术】企业级应用,主要是讲PHP5对Webservice的一些实现(以下的程序可以被Java,NET,C等正常调用)

  国内用PHP写WebService的真的很少,网上资料也没多少,公司的项目开发过程中,经历了不少这方面的东西,写出来以供大家参考(谢谢老农提供的WSDL和程序文件)

  客户端

  代码:

    01. 
  02.header ( "Content-Type: text/html; charset=utf-8" ); 
  03./* 
  04.* 指定WebService路径并初始化一个WebService客户端 
  05.*/ 
  06.$ws = "http://soap/soapCspMessage.php?wsdl"; 
  07.$client = new SoapClient ( $ws, array ('trace' => 1, 'uri' => 'http://www.zxsv.com/SoapDiscovery/' ) ); 
  08./* 
  09.* 获取SoapClient对象引用的服务所提供的所有方法 
  10.*/ 
  11.echo ("SOAP服务器提供的开放函数:"); 
  12.echo (' 
'); 
  13.var_dump ( $client->__getFunctions () ); 
  14.echo (' 
'); 
  15.echo ("SOAP服务器提供的Type:"); 
  16.echo (' 
'); 
  17.var_dump ( $client->__getTypes () ); 
  18.echo (' 
'); 
  19.echo ("执行GetGUIDNode的结果:"); 
  20.//$users = $client->GetUsers(); 
  21.//var_dump($HelloWorld ); 
  22.$parameters = array('uname'=>'zxsv',"upassword"=>'123'); 
  23.$out = $client->HelloWorld($parameters); 
  24.$datadb = $out->HelloWorldResponse; 
  25.var_dump($out); 
  26.?>



  服务端

  代码:

    01. 
  02.class Member 
  03.{ 
  04.public $UserId; 
  05.public $Name; 
  06.public function __construct($parmas){ 
  07.$this->UserId = $parmas[0]; 
  08.$this->Name = $parmas[1]; 
  09.} 
  10.} 
  11.$servidorSoap = new SoapServer('testphp.XML',array('uri' => 'http://www.TestPHP.com/','encoding'=>'utf-8','soap_version' => SOAP_1_2 )); 
  12.$servidorSoap->setClass(Testphp); 
  13.$servidorSoap->handle(); 
  14.class Testphp { 
  15.public function HelloWorld($uid){ 
  16.return array('HelloWorldResult'=>"mystring".$uid->{'uname'}.' and '.$uid->{'upassword'}); 
  17.} 
  18.public function GetMember($uid){ 
  19.$s=array(); 
  20.for($i=0;$i<$uid->{'uid'};$i++){ 
  21.$s[] =&new Member(array($i, $uid->{'uname'}.'我测试'.$i)); 
  22.} 
  23.return array('GetMemberResult'=>$s); 
  24.} 
  25.} 
  26.?>


  到这里应该都看的懂吧

  下面是WSDL文件

  代码:

001.<?xml version="1.0" encoding="utf-8"?> 
002.<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.TestPHP.com/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.TestPHP.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
003.<wsdl:types> 
004.<s:schema elementFormDefault="qualified" targetNamespace="http://www.TestPHP.com/"> 
005.<s:element name="HelloWorld"> 
006.<s:complexType> 
007.<s:sequence> 
008.<s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" /> 
009.<s:element minOccurs="0" maxOccurs="1" name="upassword" type="s:string" /> 
010.</s:sequence> 
011.</s:complexType> 
012.</s:element> 
013.<s:element name="HelloWorldResponse"> 
014.<s:complexType> 
015.<s:sequence> 
016.<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" /> 
017.</s:sequence> 
018.</s:complexType> 
019.</s:element> 
020.<s:element name="GetMember"> 
021.<s:complexType> 
022.<s:sequence> 
023.<s:element minOccurs="1" maxOccurs="1" name="uid" type="s:int" /> 
024.<s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" /> 
025.</s:sequence> 
026.</s:complexType> 
027.</s:element> 
028.<s:element name="GetMemberResponse"> 
029.<s:complexType> 
030.<s:sequence> 
031.<s:element minOccurs="0" maxOccurs="1" name="GetMemberResult" type="tns:ArrayOfMember" /> 
032.</s:sequence> 
033.</s:complexType> 
034.</s:element> 
035.<s:complexType name="ArrayOfMember"> 
036.<s:sequence> 
037.<s:element minOccurs="0" maxOccurs="unbounded" name="Member" nillable="true" type="tns:Member" /> 
038.</s:sequence> 
039.</s:complexType> 
040.<s:complexType name="Member"> 
041.<s:sequence> 
042.<s:element minOccurs="1" maxOccurs="1" name="UserId" type="s:int" /> 
043.<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" /> 
044.</s:sequence> 
045.</s:complexType> 
046.</s:schema> 
047.</wsdl:types> 
048.<wsdl:message name="HelloWorldSoapIn"> 
049.<wsdl:part name="parameters" element="tns:HelloWorld" /> 
050.</wsdl:message> 
051.<wsdl:message name="HelloWorldSoapOut"> 
052.<wsdl:part name="parameters" element="tns:HelloWorldResponse" /> 
053.</wsdl:message> 
054.<wsdl:message name="GetMemberSoapIn"> 
055.<wsdl:part name="parameters" element="tns:GetMember" /> 
056.</wsdl:message> 
057.<wsdl:message name="GetMemberSoapOut"> 
058.<wsdl:part name="parameters" element="tns:GetMemberResponse" /> 
059.</wsdl:message> 
060.<wsdl:portType name="TestPHPSoap"> 
061.<wsdl:operation name="HelloWorld"> 
062.<wsdl:input message="tns:HelloWorldSoapIn" /> 
063.<wsdl:output message="tns:HelloWorldSoapOut" /> 
064.</wsdl:operation> 
065.<wsdl:operation name="GetMember"> 
066.<wsdl:input message="tns:GetMemberSoapIn" /> 
067.<wsdl:output message="tns:GetMemberSoapOut" /> 
068.</wsdl:operation> 
069.</wsdl:portType> 
070.<wsdl:binding name="TestPHPSoap" type="tns:TestPHPSoap"> 
071.<soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
072.<wsdl:operation name="HelloWorld"> 
073.<soap:operation soapAction="http://www.TestPHP.com/HelloWorld" /> 
074.<wsdl:input> 
075.<soap:body use="literal" /> 
076.</wsdl:input> 
077.<wsdl:output> 
078.<soap:body use="literal" /> 
079.</wsdl:output> 
080.</wsdl:operation> 
081.<wsdl:operation name="GetMember"> 
082.<soap:operation soapAction="http://www.TestPHP.com/GetMember" /> 
083.<wsdl:input> 
084.<soap:body use="literal" /> 
085.</wsdl:input> 
086.<wsdl:output> 
087.<soap:body use="literal" /> 
088.</wsdl:output> 
089.</wsdl:operation> 
090.</wsdl:binding> 
091.<wsdl:binding name="TestPHPSoap12" type="tns:TestPHPSoap"> 
092.<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
093.<wsdl:operation name="HelloWorld"> 
094.<soap12:operation soapAction="http://www.TestPHP.com/HelloWorld" /> 
095.<wsdl:input> 
096.<soap12:body use="literal" /> 
097.</wsdl:input> 
098.<wsdl:output> 
099.<soap12:body use="literal" /> 
100.</wsdl:output> 
101.</wsdl:operation> 
102.<wsdl:operation name="GetMember"> 
103.<soap12:operation soapAction="http://www.TestPHP.com/GetMember" /> 
104.<wsdl:input> 
105.<soap12:body use="literal" /> 
106.</wsdl:input> 
107.<wsdl:output> 
108.<soap12:body use="literal" /> 
109.</wsdl:output> 
110.</wsdl:operation> 
111.</wsdl:binding> 
112.<wsdl:service name="TestPHP"> 
113.<wsdl:port name="TestPHPSoap" binding="tns:TestPHPSoap"> 
114.<soap:address location="http://soap/goodwsdl/testphp.php" /> 
115.</wsdl:port> 
116.<wsdl:port name="TestPHPSoap12" binding="tns:TestPHPSoap12"> 
117.<soap12:address location="http://soap/goodwsdl/testphp.php" /> 
118.</wsdl:port> 
119.</wsdl:service> 
120.</wsdl:definitions>

这里有返回的两个字段,一个是返回字符串,这个很好理解

01.<s:element name="HelloWorld"> 
02.<s:complexType> 
03.<s:sequence> 
04.<s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" /> 
05.<s:element minOccurs="0" maxOccurs="1" name="upassword" type="s:string" /> 
06.</s:sequence> 
07.</s:complexType> 
08.</s:element> 
09.<s:element name="HelloWorldResponse"> 
10.<s:complexType> 
11.<s:sequence> 
12.<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" /> 
13.</s:sequence> 
14.</s:complexType> 
15.</s:element>


  这一段就字符串的

  那返回数组的就比较麻烦了,我和老农搞了一两周才发现是WSDL文件写错了,看下面的一段


01.<s:element name="GetMember"> 
02.<s:complexType> 
03.<s:sequence> 
04.<s:element minOccurs="1" maxOccurs="1" name="uid" type="s:int" /> 
05.<s:element minOccurs="0" maxOccurs="1" name="uname" type="s:string" /> 
06.</s:sequence> 
07.</s:complexType> 
08.</s:element> 
09.<s:element name="GetMemberResponse"> 
10.<s:complexType> 
11.<s:sequence> 
12.<s:element minOccurs="0" maxOccurs="1" name="GetMemberResult" type="tns:ArrayOfMember" /> 
13.</s:sequence> 
14.</s:complexType> 
15.</s:element> 
16.<s:complexType name="ArrayOfMember"> 
17.<s:sequence> 
18.<s:element minOccurs="0" maxOccurs="unbounded" name="Member" nillable="true" type="tns:Member" /> 
19.</s:sequence> 
20.</s:complexType> 
21.<s:complexType name="Member"> 
22.<s:sequence> 
23.<s:element minOccurs="1" maxOccurs="1" name="UserId" type="s:int" /> 
24.<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" /> 
25.</s:sequence> 
26.</s:complexType>



  第一段GetMember是输入,最重要的是GetMemberResponse这段,看type=”tns:ArrayOfMember”这里,返回一 个数组,WSDL中定义了ArrayOf这个,后面的就简单了,ArrayOfMember的类型是type=”tns:Member” ,从name=”Member”得到要返回的数组,完工。


 方法2:

  Ping Service,博客程序提供一种通知机制,以便在第一时间将博客的更新信息发布到提供Ping Service服务的网站,写聚合的时候研究了一下

  先看标准吧

  这是一个标准的Ping Service,用XMLRPC来传数据的,注释写的这么详细,代码说明就不需要了吧,PHP5开启XMLRPC方法

  client.php

  代码:

01. 
  02.$host = 'zxsv'; 
  03.$port = 80; 
  04.$rpc_server = '/test/xmlrpc_server.php'; 
  05.$title = 'zxsv'; 
  06.$server = 'http://zxsv/test/'; 
  07.$rss = 'http://zxsv/test/rss.php'; 
  08.//WeblogUpdates.Ping方法 
  09.$Ping = xmlrpc_encode_request('weblogUpdates.Ping', array($title, $server )); 
  10.//weblogUpdates.extendedPing方法 
  11.$extendedPing = xmlrpc_encode_request('weblogUpdates.extendedPing', array($title, $server, $rss )); 
  12.//调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息 
  13.$response = rpc_client_call($host, $port, $rpc_server, $Ping); 
  14.$split = ''; 
  15.$xml = explode($split, $response); 
  16.$xml = $split . array_pop($xml); 
  17.$response = xmlrpc_decode($xml); 
  18.//输出从RPC服务器端获取的信息 
  19.print_r($response); 
  20./** 
  21.* 函数:提供给客户端进行连接XML-RPC服务器端的函数 
  22.* 参数: 
  23.* $host 需要连接的主机 
  24.* $port 连接主机的端口 
  25.* $rpc_server XML-RPC服务器端文件 
  26.* $request 封装的XML请求信息 
  27.* 返回:连接成功成功返回由服务器端返回的XML信息,失败返回false 
  28.*/ 
  29.function rpc_client_call($host, $port, $rpc_server, $request) { 
  30. 
  $fp = fsockopen($host, $port); 
  31. 
  $query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n"; 
  32. 
  if (!fputs($fp, $query, strlen($query))) { 
  33. 
  $errstr = "Write error"; 
  34. 
  return false; 
  35. 
  } 
  36. 
  $contents = ''; 
  37. 
  while (!feof($fp)){ 
  38. 
  $contents .= fgets($fp); 
  39. 
  } 
  40. 
  fclose($fp); 
  41. 
  return $contents; 
  42.} 
  43.?>

server.php  

代码:

    01. 
  02./**
    03.* 函数:提供给RPC客户端调用的函数 
  04.* 参数: 
  05.* $method 客户端需要调用的函数 
  06.* $params 客户端需要调用的函数的参数数组 
  07.* 返回:返回指定调用结果 
  08.*/ 
  09.function rpc_server_extendedping($method, $params) { 
  10. 
  $title = $params[0]; 
  11. 
  $server = $params[1]; 
  12. 
  $rss = $params[2]; 
  13. 
  //中间的判断,成功返回$XML_RPC_String 
  14. 
  $XML_RPC_String = array('flerror'=>false,'message'=>'Thanks for the ping.'); 
  15. 
  return $XML_RPC_String; 
  16.} 
  17.function rpc_server_ping($method, $params) { 
  18. 
  $title = $params[0]; 
  19. 
  $server = $params[1]; 
  20. 
  //中间的判断,成功返回$XML_RPC_String 
  21. 
  $XML_RPC_String = array('flerror'=>false,'message'=>'Thanks for the ping.'); 
  22. 
  return $XML_RPC_String; 
  23.} 
  24.//产生一个XML-RPC的服务器端 
  25.$xmlrpc_server = xmlrpc_server_create(); 
  26.//注册一个服务器端调用的方法rpc_server,实际指向的是rpc_server_extendedping函数 
  27.xmlrpc_server_reGISter_method($xmlrpc_server, "weblogUpdates.extendedPing", "rpc_server_extendedping"); 
  28.xmlrpc_server_register_method($xmlrpc_server, "weblogUpdates.Ping", "rpc_server_ping"); 
  29.//接受客户端POST过来的XML数据 
  30.$request = $HTTP_RAW_POST_DATA; 
  31.//print_r($request); 
  32.//执行调用客户端的XML请求后获取执行结果 
  33.$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null); 
  34.//把函数处理后的结果XML进行输出 
  35.header('Content-Type: text/xml'); 
  36.echo $xmlrpc_response; 
  37.//销毁XML-RPC服务器端资源 
  38.xmlrpc_server_destroy($xmlrpc_server); 
  39.?>
</pre><p>  类写的,有BUG  </p><p><span style="white-space:pre">	</span>代码: <span style="white-space:pre">	</span></p><pre name="code" class="php">    01. 
  02.class Pings { 
  03. 
  public $xmlrpc_server; 
  04. 
  public $xmlrpc_response; 
  05. 
  public $methodName; 
  06. 
  public function __construct() { 
  07. 
  //产生一个XML-RPC的服务器端 
  08. 
  $this->xmlrpc_server = xmlrpc_server_create (); 
  09. 
  $this->run (); 
  10. 
  } 
  11. 
  12. 
  //注册一个服务器端调用的方法rpc_server,实际指向的是ping函数 
  13. 
  public function rpc_server() { 
  14. 
  $this->methodName = !$this->methodName ? 'weblogUpdates.extendedPing':'weblogUpdates.Ping'; 
  15. 
  xmlrpc_server_register_method ( $this->xmlrpc_server, $this->methodName, array (__CLASS__, "ping")); 
  16. 
  } 
  17. 
  /** 
  18. 
  * 函数:提供给RPC客户端调用的函数 
  19. 
  * 参数: 
  20. 
  * $method 客户端需要调用的函数 
  21. 
  * $params 客户端需要调用的函数的参数数组 
  22. 
  * 返回:返回指定调用结果 
  23. 
  */ 
  24. 
  public function ping($method, $params) { 
  25. 
  $this->title = $params [0]; 
  26. 
  $this->server = $params [1]; 
  27. 
  $this->rss = $params [2]; 
  28. 
  $this->tag = $params [3]; 
  29. 
  //$a = $this->title ? $this->update():''; 
  30. 
  $string = array ('flerror' => false, 'message' => 'Thanks for the ping.', 'legal' => "You agree that use of the blueidea.com ping service is governed by the Terms of Use found at www.blueidea.com." ); 
  31. 
  return $string; 
  32. 
  } 
  33. 
  34. 
  public function update(){ 
  35. 
  echo '这里放更新的一些条件'; 
  36. 
  } 
  37. 
  38. 
  public function run() { 
  39. 
  $this->rpc_server (); 
  40. 
  $request = isset ( $GLOBALS ["HTTP_RAW_POST_DATA"] ) ? file_get_contents ( "php://input" ) : $GLOBALS ["HTTP_RAW_POST_DATA"]; 
  41. 
  $this->xmlrpc_response = xmlrpc_server_call_method ( $this->xmlrpc_server, $request, null ); 
  42. 
  //把函数处理后的结果XML进行输出 
  43. 
  header ( 'Content-Type: text/xml' ); 
  44. 
  echo $this->xmlrpc_response; 
  45. 
  } 
  46. 
  47. 
  //销毁XML-RPC服务器端资源 
  48. 
  public function __destruct() { 
  49. 
  xmlrpc_server_destroy ( $this->xmlrpc_server ); 
  50. 
  } 
  51.} 
  52.$Obj = new Pings ( ); 
  53.?>


  WebService的最常用的两种方法算是写齐了。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值