BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #3346同步于 2008/5/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

学习笔记:XML-RPC

wks
2008/5/30镜像同步0 回复
有时候只是有些懒,想做一个服务器和一个客户端,然后让它们之间通信,交换一些简单信息。比如搭一个服务器,客户端发送两个整数,服务器算出它们的和,返回客户端。 但是就是懒得直接用Socket,懒得做文字处理,处理TCP的数据流,还得搞语法分析等一堆麻烦事。虽然我刚学过编译原理,对Lex和Yacc还是很熟悉的,但是就为了一个小程序大费周折值得吗?。 于是我找一些高层的协议:有没有能让网络通信就像调用一个本地的函数一样简单?比如: 服务器端设置一个函数: int calculate_a_plus_b(int a, int b) { return a+b; } 在客户端调用: result=server.calculate_a_plus_b(5,8) 然后result就等于13了。 这个东西有,它叫做XML-RPC。 它的工作原理是将一个函数调用,包括函数名,所有参数名和参数内容,转换成XML文本流,通过HTTP协议发送到服务器;服务器将返回值也转换成XML的形式,发回客户端。 举一个例子(这不是算两个数的和): Here's an example of an XML-RPC request: POST /RPC2 HTTP/1.0 User-Agent: Frontier/5.1.2 (WinNT) Host: betty.userland.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall> 函数名叫做“examples.getStateName”,有一个32位整型参数41。这个文本流传给服务器之后,服务器也用XML返回: Here's an example of a response to an XML-RPC request: HTTP/1.1 200 OK Connection: close Content-Length: 158 Content-Type: text/xml Date: Fri, 17 Jul 1998 19:55:08 GMT Server: UserLand Frontier/5.1.2-WinNT <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>South Dakota</string></value> </param> </params> </methodResponse> 返回一个字符串,“South Dakota”。 当然,用网络传递的话,和系统和语言都没有关系了。你可以在Linux上向一个Windows服务器发送过程调用,这是没问题的。 现在,很多语言都有支持XML-RPC的库,包括C,C++,JAVA,.NET,Perl,Python都有。因此,不需要关心如何把函数调用转换成XML,然后怎么转换回调用。你只要把主要精力放在你的函数本身的逻辑上就行了。可以为你省很多事。 用C语言比较麻烦一些,毕竟C语言比较底层,你需要建立几个结构体和字符串,把函数名,以及参数的指针放进去,然后调一个函数来建立连接,调另一个发送远程调用。然后小心地处理异常。可以去看看下面的例子,C语言的。 http://xmlrpc-c.svn.sourceforge.net/viewvc/xmlrpc-c/trunk/examples/xmlrpc_sample_add_client.c?view=markup 真正精彩的是一些高层的语言,尤其是脚本语言,比如下面是一个Python的客户端,就3行: import xmlrpclib server = xmlrpclib.Server("http://www.example.com/RPC2") result = server.calculate_a_plus_b(5,8) 嗯,这就行了。如果服务器设置正确,那么result就等于13了。 其实,server是一个对象,连接服务器用。server对象根本就没有calculate_a_plus_b这个方法。但是语言有“内省”能力,它如果你调用一个不存在的方法,会有特定的方法处理这样的调用。这里server对象自动将其转换成XML然后发送到服务器去,然后将返回值转换回native的类型。因此,乍一看,你根本就不知道这个“方法调用”是在远端的。 XML-RPC的不足: 毕竟要经过"函数调用"->XML转换过程,运行时要付出时间的代价。但是开发时间有时候比运行时效率更重要。 其它类似XML-RPC的协议: SOAP:W3C提出的协议,功能比XML-RPC强大,但是太复杂。 各个语言的XML-RPC库: C/C++: xmlrpc-c http://xmlrpc-c.sourceforge.net/ Java: Apache xmlrpc http://ws.apache.org/xmlrpc/ .NET: XML-RPC.net http://www.xml-rpc.net/ Perl: RPC::XML http://www.blackperl.com/RPC::XML/ Python,Ruby: 标准库里有。
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。