jQuery.getでtypeを指定しないと、MIME-Typeによって挙動が変わってしまう。
(jQuery1.4.2)
ある日、JSONテキストを受け取ってevalする処理がエラーを吐くようになった。こういうコード。
jQuery.get('/foo.json', function(json) { var foo = eval('(' + json + ')'); });
思い当たるのは、Content-Typeがtext/plainだったのをapplication/jsonに変更したこと。
実際にそれが原因だったのだけれども。
/* MIME-Type: text/plain */jQuery.get('/foo.json', function(json) {typeof json == 'string';}); /* MIME-Type: application/json */jQuery.get('/foo.json', function(json) {typeof json == 'object';});
/foo.jsonのMIME-Typeがtext/plainだとコールバックに渡ってくるのは文字列なんだけども、
application/jsonだとオブジェクトが渡ってきた。(それを更にevalしちゃってたのでエラーになっていたという話)
安直にevalを外すという修正をしてしまうと対象リソースのMIME-Typeに左右されるようになってしまうので、getJSONに統一するようにした。
getJSONは対象リソースがJSONだと明示するメソッドで、
/* MIME-Type: text/plain */jQuery.getJSON('/foo.json', function(json) {typeof json == 'object';}); /* MIME-Type: application/json */jQuery.getJSON('/foo.json', function(json) {typeof json == 'object';});
のように、MIME=Typeがどうなっていようとコールバックにはオブジェクトが渡ってくる。
ってかこれは
/* MIME-Type: text/plain */jQuery.get('/foo.json', function(json) {typeof json == 'object';}, 'json');
のようにjQuery.getにタイプ'json'を渡してあげるのと同じことなんだけどね。
毎回'json'を渡すよりは、getJSONが用意されてるんだからそっち使った方が良いかなーと。