php的web service实现----xmlrpc

本文介绍了WebService的概念、用途及组成技术,包括XML/XSD、SOAP和WSDL,并通过实例展示了XML-RPC的工作原理及PHP实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 web service是什么? 从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个 Web service 的应用程序叫做客户。例如,你想创建一个Web service ,它的作用是返回当前的天气情况。那么你可已建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。要调用这个ASP页面,客户端需要发送下面的这个HTTP GET请求:   http://host.company.com/weather.asp?zipcode=20171   返回的数据就应该是这样:   21,晴 这个ASP页面就应该可以算作是Web service 了。因为它基于HTTP GET请求,暴露出了一个可以通过Web调用的API。当然,Web service 还有更多的东西。 二、 在什么情况下你应该使用Web service 用来实现在异构系统中实现通信和数据传输,比如提供天气预报的web service,不管你的客户端用什么技术(是.net,还是java),是winform程序还是webform程序,都可以使用这个web service来实现天气预报的功能 三、 什么是web servie平台 Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。 四、 组成web service平台的三大技术: 1. XML和XSD (解决数据的基本格式和数据类型) 可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的 XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,还是64 位?这些细节对实现互操作性都是很重要的。W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web service平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合Web service标准,所有你使用的数据类型都必须被转换为XSD类型 2. 简单对象访问协议(SOAP) (解决了调用web service) SOAP提供了标准的RPC方法来调用Web service, SOAP规范定义了SOAP消息的格式,以及怎样通过HTTP协议来使用SOAP。SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。 3. Web service描述语言(WSDL) Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。 一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。 五、 XMLRPC是一种通过XML格式传送的远程过程调用(RPC,Remote Procedure Call) 原理: 服务器端使用xmlrpc_server_create产生个服务器端, 然后把需要暴露RPC接口进行注册, 接受RPC客户端POST过来XML数据, 然后进行处理 , 处理结果通过XML形式显示给客户端 工作过程: 服务器端凭借强大的运算能力,提供很多的接口函数(Method Call)供客户端调用。客户端和服务器端通过HTTP协议传递函数名(Method Name)、调用参数(Params)和返回值(Method Response),为方便在网络上传输,这些值使用的都是XML格式。 下面xmlrpc_server.php为服务器端文件,xmlrpc_client.php为客户端文件,均通过测试, 前提是得为php安装xmlrpc扩展,具体的安装就不多说,如有问题,网上查阅,安装中需要系统中有libxml2,我是通过yum安装的 libxml2的。 在linux中安装libxml2时,可能会出现GPG no key的提示信息,执行命令 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY 导入GPG密钥即可 xmlrpc_server.php /**提供给rpc客户端使用的函数 * $method 客户端需要调用的函数的参数数组 * $params 参数数组 * 返回:返回指定调用的结果 */ function rpc_server_func($method, $params) { $parameter = $params[0]; if($parameter == "get") { $return = "This data by get method"; } else { $return = "Not specify method or params"; } return $return; } //create a server of xml-rpc $xmlrpc_server = xmlrpc_server_create(); //register a method :rpc_server,point to function of rpc_server_func xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func"); //accept xml data of customer posting //$request = $GLOBALS['HTTP_RAW_POST_DATA']; //$HTTP_RAW_POST_DATA只有在头信息content-type为xml时,提交的post数据才保存在该公共变量中 $request = $HTTP_RAW_POST_DATA; //execute xml request and get result $xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null); //output header("Content-Type:text/xml"); echo $xmlrpc_response; //destroy xml-rpc server xmlrpc_server_destroy($xmlrpc_server); ?> xmlrpc_client.php function:connect xml-rpc server * $host is hostname * $port is portable * $rpc_server is xml-rpc server file * $request * * return: success return xml info ,else false * */ function rpc_client_call($host, $port, $rpc_server, $request){//open server$fp = fsockopen($host,$port); //create post request//注意:post的header头,除了换行符,不能有任何空格,否则解析不了$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";//sent request to serverif(!fputs($fp, $query, strlen($query))){ $errstr = "Write error"; return false;} //get return info including http header and xml info$contents="";while(!feof($fp)){ $contents .=fgets($fp);} fclose($fp);return $contents; } $host = "172.20.30.22";$port = 80; $rpc_server = "/xmlrpc_test/rpc_server.php"; $request = xmlrpc_encode_request("rpc_server","get"); //var_dump($GLOBALS); $response = rpc_client_call($host, $port, $rpc_server, $request); print_r($response); //分析从服务器端返回的xml,去掉http头信息,并且把xml转为php能识别的字符串 $split = ''; $xml = explode($split, $response); $xml = $split.array_pop($xml); $response = xmlrpc_decode($xml); print_r($response); ?> 运行结果: HTTP/1.1 200 OK Date: Wed, 12 Aug 2009 22:17:06 GMT Server: Apache/2.2.4 (Unix) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.1 X-Powered-By: PHP/5.2.1 Content-Length: 182 Connection: close Content-Type: text/xml This data by get method This data by get method /**********************************************************************************************************/ 附:下面把运行中的传递的xml信息调试输出的结果列出,仅供分析: 其中客户端发送的xml信息为(通过在代码中输出相应的变量即可看到): rpc_server get 其中服务器端返回的xml信息为: This data by get method

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值