Chinaunix首页 | 论坛 | 博客
  • 博客访问: 536891
  • 博文数量: 166
  • 博客积分: 4038
  • 博客等级: 上校
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:29
文章分类

全部博文(166)

文章存档

2010年(12)

2009年(126)

2008年(28)

分类: 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 '
';
} else {
    //print errors
    print 'Error: '.$rsp->faultcode().', '.$rsp->faultstring().'
';
}

//show messages
//然后我们来查看一下报文内容
$msg->createpayload();
print 'REQUEST:

'.$msg->payload.'';
print 'RESPONSE:'.$rsp->serialize().'';

?>

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"中文",否则也会出现编码问题。

阅读(931) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~