読者です 読者をやめる 読者になる 読者になる

[js][ruby] jQueryの挙動を調べた

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>

サーバの方はRubysinatra使ってさっくりと。(最初知らなくて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