getJSONを使うためのクライアントサイド/サーバーサイドの実装
JQueryにはgetJSONという便利なメソッドがあるのだが、
クライアントサイド/サーバーサイドの双方から使い方を解説している記事を見かけなかったので、
メモとして残しておく。
例えばサーバーから以下のようなjsonオブジェクトを取得したいとする。
{ 'title' : 'foo', id' : 'foo_id' }
クライアントからの呼び出しは、例えばこうなる。
var CGI_URL = "http://example.com/cgi"; $.getJSON( CGI_URL + "?callback=?", null, function( data, status ){ document.body.innerHTML = "<h1>" + data.title + "<h1>" + data.id }
jsonが取得できるとコールバックが呼ばれる。
dataが取得したjsonオブジェクト、statusがリクエスト結果を表す文字列。
「callback=?」の部分はJQueryによって適当な関数名、例えばjQuery15019275276153348386_1303305468939に置き換えられる。
- つまり、http://example.com/cgi?callback=?というリクエストは、http://example.com/cgi?callback=jQuery15019275276153348386_1303305468939というリクエストに置き換えられる。
- jQuery15019275276153348386_1303305468939は、コールバック関数が格納されている変数である。
サーバー側にはcgiパラメータcallbackが渡されてくるので、それを使ってこんなjavascriptを返す。
jQuery15019275276153348386_1303305468939({ 'title' : 'foo', id' : 'foo_id' })
これをクライアントサイドで実行すれば、jQuery15019275276153348386_1303305468939に格納されたコールバックがjsonを引数にして呼び出される。
(実行はJQueryが勝手にやってくれる)
これを実現するサーバーサイドの実装はこうなる。(ruby)
require "cgi" cgi = CGI.new print "Content-Type: application/javascript;charset=utf-8\n\n" print cgi["callback"] + "({ 'title' : 'foo', 'id' : 'foo_id' })"
cgiパラメータとして渡されてきたcallbackをjsonを引数にして呼び出すjavascriptを返しているだけ。