2005-05-05

Ajax 通信用の http メソッドを定義する

Simple Ajax Toolkit SAJAX というのを見つけました。クライアント側の HTML も、サーバで生成してしまうライブラリで、Perl、PHP、Ruby、Python などのスクリプトが入っています。ASP とか JSP とか PHP とかで作ったウェブアプリケーションなどでは、当然、こうなりますね。全部サーバ側で管理できるので、Model/View/Contorl 的な書き方もできます。



で、SAJAX を使うのかと見せかけて、結局使わないで、ちまちま書いています。




# サーバ
from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer
import socket

class Server(HTTPServer):

# 動作中に Ctrl+C で停止させたあと、再び実行しても

# ポートが使用中ですとかいうエラーがでないように、オーバーライド。

def server_bind(self):

self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

HTTPServer.server_bind(self)



# 標準ライブラリの SimpleHTTPRequestHandler を継承します。

# QUERY メソッドのハンドラを追加します。Ajax で使うのは、このメソッド

# GET メソッドはデフォルトのまま、ファイルの内容を返す。

class Handler(SimpleHTTPRequestHandler):

def do_QUERY(self):

self.send_response(200)

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

self.end_headers()

try:

content = query(self.path[1:])

except Exception:

content = ""

print >>self.wfile, content




// クライアントの JavaScript
var req;

function query() {

// Ajax 通信用に QUERY メソッドでデータを送信する。

asyncCall("QUERY", document.ui.inputString.value, myCallback);

}



function asyncCall(method, url, callback) {

if (window.XMLHttpRequest) {

req = new window.XMLHttpRequest();

req.onreadystatechange = callback;

req.open(method, url, true);

req.send(null);

} else if (window.ActiveXObject) {

req = new ActiveXObject("Microsoft.XMLHTTP");

if (req) {

req.onreadystatechange = callback;

req.open(method, url, true);

req.send();

}

}

}