分类: Python/Ruby
2009-04-22 22:18:09
可以通过XML-RPC让不同平台的软件互相交互,我们假设用PHP做前台(客户端),Python作为服务后台,之间通过XML-RPC调用Python提供的服务。例子如下:
1、PHP客户端
//xmlrpc_client.php
//XML-RPC客户端演示程序
require('xmlrpc.inc');
$xmlrpc_internalencoding='UTF-8';
//创建client对象, 三个参数依次为 path, hostname, port
#$s=new xmlrpc_client('/testxml/xmlrpc_server.php', 'localhost', 80);
$s=new xmlrpc_client('/', 'localhost', 8888);
//create xmlrpcval object, which allows the encoding of our variable
//创建xmlrpcval对象,将我们的PHP变量编码为XML-RPC需要的XML形式
#$inputString=new xmlrpcval('world胜利', 'string');
$inputString = php_xmlrpc_encode('胜利world');
//create an array of parameters
//尽管我们只有一个参数,但仍然要转换成数组的形式,因为xmlrpcmsg的第二个参数是一个参数表
$parameters=array($inputString);
//create the message object
//创建XML-RPC报文,参数分别为 远程方法名 和 参数表
$msg=new xmlrpcmsg('echoString', $parameters);
//$s->request_charset_encoding = 'utf-8';
//send the message, get the response
//发送报文,返回值$rsp为一个xmlrpcresp对象,它包含以下三个方法:
//faultCode() 出错代码,如果成功将返回0
//faultString() 出错信息
//value() 返回值,以xmlrpcval对象形式存在,PHP使用前需要进行解码
$s->debug = true;
$rsp=$s->send($msg);
//check for errors
if($rsp->faultcode()==0) {
//decode the response to a PHP type
//xmlrpc_decode()函数用于将xmlrpcval对象解码
$response=php_xmlrpc_decode($rsp->value());
//print results
print '
';';
var_dump($response);
print '
//show messages
//然后我们来查看一下报文内容
$msg->createpayload();
print 'REQUEST:
?>
2、Python服务端
# -*- coding:GB2312 -*-
import SimpleXMLRPCServer
#定义自己的CMS类
class MyCMS:
def getVersion(self):#向外公开版本的方法
return "Powerd By Python 0.1a"
def echoString(self, strs):
#return ("VPhello我" + strs).encode('utf_8')
s = u'我来自Python的世界!!'
#return s.encode('gb2312')
return s + strs
cms = MyCMS()
server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8888))#, encoding='utf_8')
server.register_instance(cms)
print "Listening on port 8888"
server.serve_forever()#服务器执行,并监听8888端口
注意的是:
上面红色标识的代码不能正确运行,主要是由于Unicode的问题,在PHP中要采用php_xmlrpc_encode将所有的参数进行打包,而Python中如果返回的是Unicode字符串则必须明确指定是u"中文",否则也会出现编码问题。