WebService最常用的两种方法

企业级应用,主要是讲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”得到要返回的数组,完工。

  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 .? >

  类写的,有BUG

  代码:

  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的最常用的两种方法算是写齐了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值