js書くのが久々すぎて完全に忘れてたので、コード汚いけど気にしない。
HTTP Status 2xx系なのにjQueryがエラー扱いするような現象を見かけたので検証してみた。
結論としては1.6.3だと204, 205はエラー扱い。.failでも error : でも同様。
1.7.2なら2xx系は全部成功扱いになってた。バージョンに注意。
少し気になるのがerror扱いになってるはずなのに errorparsererror となっているところ。エラー扱いのコードではパース処理をかけてないはずなのだが...?
xmlが帰ってくることを期待しているので、レスポンスコード2xx系だとパースしようとするも、レスポンスボディはno contentなのでパースに失敗、エラーとして処理、という流れだろうか。
1.7.2では、そこら辺を考えず、2xx系のレスポンスコードが帰ってくれば成功扱い、となっている気がする。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Demo</title> <script src="jquery-1.6.3.min.js"></script> <!-- <script src="jquery-1.7.2.min.js"></script> --> <script> baseurl = "http://localhost:4567/res/"; $('document').ready(function(){ $('#run').click(function(event){ var codelist = new Array(200, 201, 202, 203, 204, 205, 206, 400, 401, 402, 403, 404, 405, 406); for(var i = 0; i < codelist.length; i++){ $('#result').append("req:" + baseurl + codelist[i] + "<br/>"); var jqxhr = $.ajax({ url : baseurl + codelist[i], dataType : "xml", async : false, success : function(msg){ $('#result').append("success" + new XMLSerializer().serializeToString(msg) + "<br/>"); }, error : function(xmlhttpreq, msg){ $('#result').append("error" + msg + "<br/>"); } }); // .fail(function() { $('#result').append("error" + "<br/>"); }); } }); }); </script> </head> <body> <p>jQueryのレスポンスコードとAjaxのエラー処理の検証コード</p> <p>1.6.3だと204, 205はエラー扱い。.failでも error : でも同様</p> <input type="button" id="run" value="RUN"/> <div id="result"></div> </body> </html>
サーバの方はRubyでsinatra使ってさっくりと。(最初知らなくてWEBrickでごりごり書いてたのは秘密)
require 'sinatra' require 'rubygems' get '/res/:code' do status params[:code] headers \ 'Content-Type' => 'application/xml' body "<code>#{params[:code]}</code>" end
実行結果
req:http://localhost:4567/res/200 success200 req:http://localhost:4567/res/201 success201 req:http://localhost:4567/res/202 success202 req:http://localhost:4567/res/203 success203 req:http://localhost:4567/res/204 errorparsererror req:http://localhost:4567/res/205 errorparsererror req:http://localhost:4567/res/206 success206 req:http://localhost:4567/res/400 errorerror req:http://localhost:4567/res/401 errorerror req:http://localhost:4567/res/402 errorerror req:http://localhost:4567/res/403 errorerror req:http://localhost:4567/res/404 errorerror req:http://localhost:4567/res/405 errorerror req:http://localhost:4567/res/406 errorerror