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"中文",否則也會出現編碼問題。

發佈了5 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章