首页 > php代码 > Python、PHP通过xml-rpc进行通信,xml-rpc中文的解决

Python、PHP通过xml-rpc进行通信,xml-rpc中文的解决

可以通过XML-RPC让不同平台的软件互相交互,我们假设用PHP做前台(客户端),Python作为服务后台,之间通过XML-RPC调用Python提供的服务。例子如下:

1、PHP客户端

 <?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 '<pre>';
    var_dump($response);
    print '</pre>';
} else {
    //print errors
    print 'Error: '.$rsp->faultcode().', '.$rsp->faultstring().'<br>';
}

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

?>

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


本文地址:http://www.phprm.com/code/f480d866abcdabc6c3929449b94fe939.html

转载随意,但请附上文章地址:-)

标签:none

发表留言