web-dev-qa-db-ja.com

jQuery.ajaxからレスポステンスステータスコードを取得する方法

次のコードで、私がやろうとしているのは、jQuery.ajax呼び出しからHTTP応答コードを取得することだけです。次に、コードが301(恒久的に移動)の場合は、 'Location'という応答ヘッダーを表示します。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) {
    $.ajax({
      url: url,
      complete: function (jqxhr, txt_status) {
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) {
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // }
      }
    });
  }
  </script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('a').mouseenter(
      function () {
        get_resp_status(this.href);
      },
      function () {
      }
    );
  });
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>

誰かが私が間違っているところを指摘できますか? Firebugで 'jqxhr'オブジェクトをチェックすると、ステータスコードも 'Location'レスポンスヘッダーも見つかりません。 'complete'の最後の行にブレークポイントを設定しました。

どうもありがとう。

196
Mahesh

私はjqXhrオブジェクトのstatusフィールドを見ます、ここでそれが働いているいじるがあります:

http://jsfiddle.net/magicaj/55HQq/3/

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});
192
Adam Ayres

私自身が同じような解決策を探しているこの古いスレッドに出くわし、そして受け入れられた答えがjquery ajax.complete()メソッドを使用していることを見つけました。私はここで jqueryのウェブサイト にその通知を引用します。

jqXHR.success()、jqXHR.error()、およびjqXHR.complete()のコールバックは、jQuery 1.8以降では推奨されなくなりました。 。最終的な削除のためにコードを準備するには、代わりにjqXHR.done()、jqXHR.fail()、およびjqXHR.always()を使用してください。

Ajaxレスポンスのstatus codeを知るために、以下のコードを使うことができます。

$.ajax( url [, settings ] )
.always(function (jqXHR) {
    console.log(jqXHR.status);
});

.done().fail()についても同様に動作します。

46
face

XHRリクエストがリダイレクトレスポンス(HTTPステータス301、302、303、307)を返すと、XMLHttpRequestが自動的にリダイレクトされたURLの後に続き、そのURLのステータスコード を返します。

Xhrオブジェクトのstatusプロパティを介して、リダイレクトされないステータスコード(200、400、500など)を取得できます。

そのため、301302303または307リクエストのレスポンスヘッダーからリダイレクトされた場所を取得することはできません。

ブラウザに実行させるのではなく、リダイレクトを処理できる方法で応答するようにサーバーロジックを変更する必要があるかもしれません。 実装例

41

$ .ajax関数に渡されるパラメータオブジェクトのstatusCodeプロパティを使用するほうが、おそらくもっと慣用的なjQueryです。

$.ajax({
  statusCode: {
    500: function(xhr) {
      if(window.console) console.log(xhr.responseText);
    }
  }
});

しかし、 Livingston Samuel が言ったように、JavaScriptで301のステータスコードをキャッチすることは不可能です。

37
rstackhouse

あなたはあなたのリスポンコンテンツをチェックすることができます、それをconsole.logしてください。そうすればあなたはwhitchプロパティにステータスコードがあるのを見るでしょう。あなたがJSONを理解していない場合は、ビデオを参照してください。 https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

それはあなたがJavaScriptをより快適に感じることを可能にする非常に基本的な知識を説明します。

あなたはajaxリクエストのより短いバージョンでそれをすることができます、上のコードを見てください:

$.get("example.url.com", function(data) {
                console.log(data);
            }).done(function() {
               // TO DO ON DONE
            }).fail(function(data, textStatus, xhr) {
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            }).always(function() {
                 //TO-DO after fail/done request.
                 console.log("ended");
            });

コンソール出力例

error 403 
STATUS: Forbidden 
ended

jqxhrはJSONオブジェクトです。

完全なリターン:
jqXHR(jQuery 1.4.x、XMLHTTPRequest内)オブジェクト、および要求のステータスを分類する文字列( "success"、 "notmodified"、 "error"、 "timeout"、 "abort"、または "parsererror" ")。

参照: jQuery ajax

そうするでしょう:

ステータスを取得するjqxhr.status

3
Neal