2005-05-03

Ajax と XML-RPC

HTTPをしゃべるアプリケーションがあって、ユーザインターフェイスは Ajax というのを考えています。このとき Ajax が送受信するデータ構造に XML-RPC というのは、どうでしょう。って、みんなやってそうですが。



JavaScript の XML-RPC のライブラリにはいくつかありますが、vcXMLRPC というのを使いました。クライアントはこれでおっけーです。問題は JavaScript では自分自身と同じドメインからでないと、データを読み込めないことです。



そういうわけでサーバ側でなんとかしましょう。Python の標準ライブラリに入っている SimpleXMLRPCServer.SimpleXMLRPCRequestHandler を使います。これは POST メソッドが来たときには、XML-RPC の要求が来たと解釈して、あらかじめ登録しておいた関数を実行し、結果を送り返します。これに do_GET() メソッドを追加して、GET メソッドが来たときにはパス名で示されるファイルの内容を返すようにしました。




# XML-RPC / HTTP サーバ
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler

class Server(SimpleXMLRPCServer):

def __init__(self, *args, **kw):

SimpleXMLRPCServer.__init__(self, *args, **kw)

self.register_function(self.hello)



def hello(self):

return "Hello"



class Handler(SimpleXMLRPCRequestHandler):

def do_GET(self):

self.send_response(200)

self.send_header("Content-type", "text/html")

self.end_headers()

try:

content = file(self.path[1:]).read()

print >>self.wfile, content

except Exception:

print >>self.wfile, ""



if __name__ == "__main__":

server = Server(("localhost", 9000), Handler)

server.serve_forever()



↓こっちがクライアント側の HTML と JavaScript



<html>
<head>
<title>Foo</tiele>
<script language="javascript" src="vcXMLRPC.js"></script>
<script language="javascript">
function run() {
result = XMLRPC.call("http://localhost:9000", "hello");
alert(result);
}
</script>
</head>
<body onload="run()"></body>
</html>