159

fetch や XMLHttpRequest などの JavaScript ネットワーク呼び出し、またはその他の種類の HTTP ネットワーク要求が HTTP ステータス コード 0 で失敗した場合、それはどういう意味ですか?

他のコードは HTTP 仕様では 3 桁であるため、これは有効な HTTP ステータス コードではないようです。

テストとして、ネットワークのプラグを完全に抜いてみました。無関係かもしれませんが、ステータス コード 17003 (IIRC) になりました。これは、ざっと検索すると、「DNS サーバーの検索に失敗しました」という意味です。

同じコードが場所やシステムによっては正常に機能しますが、特定の環境ではステータス コード 0 で失敗し、responseText が提供されません。

これは、インターネット URL への典型的な HTTP POST です。file:// は関係ありませんが、Firefox で成功を示す 0 が返される可能性があることを理解しています。

4

15 に答える 15

35

ブラウザによっては、jQuery ベースの AJAX 呼び出しが HTTP ステータス コード 0 で成功のコールバックを呼び出します。通常、ステータス コード「0」は、ユーザーが以前に別のページに移動したことを意味します。 AJAX 呼び出しが完了しました。

あなたが使用しているものと同じテクノロジー スタックではありませんが、うまくいけば誰かの役に立ちます。

于 2010-10-18T16:52:03.303 に答える
10

HTTP 応答コード 0 は、AJAX 要求がキャンセルされたことを示します。

これは、タイムアウト、XHR の中止、またはリクエストに対するファイアウォールの踏みつけによって発生する可能性があります。タイムアウトは一般的です。これは、要求が指定された時間内に実行できなかったことを意味します。XHR Abortion の実行は非常に簡単です。実際には XMLHttpRequest オブジェクトで .abort() を呼び出して、AJAX 呼び出しをキャンセルできます。(これは、AJAX呼び出しが返されて破棄されたオブジェクトを参照しようとしない場合、単一ページアプリケーションの良い方法です。)マークされた回答で述べたように、ファイアウォールはリクエストをキャンセルしてこれをトリガーすることもできます0 応答。

XHR Abort: jQuery を使用して Ajax リクエストを中止する

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()

XHR オブジェクトで .abort() メソッドを実行すると、エラー コールバックも発生することに注意してください。これらのオブジェクトを解析する何らかの種類のエラー処理を行っている場合、中止された XHR とタイムアウト XHR が同一であることにすぐに気付くでしょうが、jQuery を使用すると、エラー コールバックに渡される te​​xtStatus は、中止されると「中止」になります。タイムアウトを伴う「タイムアウト」が発生します。Zepto (jQuery と非常によく似ています) を使用している場合、errorType は、中止されると「エラー」になり、タイムアウトが発生すると「タイムアウト」になります。

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);
于 2012-09-13T17:45:08.357 に答える
6

回避策: 最終的に行ったこと

ファイアウォールの問題に関係していると考えたので、そのトリックを行う回避策を考え出しました. 誰かがこれと同じ問題を抱えている場合は、次のことを行いました。

  1. 以前と同じように、HTA を使用してローカル ハード ディスク上のテキスト ファイルにデータを書き込みます。

  2. ユーザーが [データをサーバーに送り返す] をクリックすると、HTA はデータを読み取り、そのデータを XML データ アイランドとして含む HTML ページを (実際には SCRIPT LANGUAGE=XML スクリプト ブロックを使用して) 書き出します。

  3. HTA は、ブラウザーで HTML ページへのリンクを起動します。

  4. HTML ページには、(Microsoft.XMLHTTP を使用して) サーバーにデータを送信する JavaScript が含まれています。

これが同様の要件を持つ人に役立つことを願っています。この場合は、展示会でラップトップで使用される Flash ゲームでした。この展示会は別の国で開催されていたため、ラップトップにアクセスすることはできず、クライアントにメールで送信することしかできませんでした。

于 2009-05-26T21:29:27.233 に答える
4

このページのこの回答で詳しく説明されているように、ステータス コード 0 は何らかの理由でリクエストが失敗したことを意味し、javascript ライブラリは失敗をステータス コード 0 として解釈しました。

これをテストするには、次のいずれかを実行できます。

1) この Chrome 拡張機能Requestlyhttpsを使用して、URL のバージョンからバージョンにURL をリダイレクトします。httpこれにより、混合コンテンツのセキュリティ エラーが発生し、最終的にステータス コード 0 が生成されます。このアプローチの利点は、アプリをまったく変更する必要はなく、この拡張機能を使用して単に URL を「書き換える」ことができます。

2) アプリのコードを変更して、必要に応じてエンドポイントがhttpバージョンではなく URL のバージョンにリダイレクトされるようにしますhttps(またはその逆)。これを行うと、リクエストはステータス コード 0 で失敗します。

于 2016-08-03T18:05:09.030 に答える
1

私の場合、AJAX 呼び出しがブラウザによってブロックされていたため、同一生成元ポリシーが原因でした。すべての HTML とスクリプトが127.0.0.1. それらが異なる起源を持っているとどのように見なすことができますか?

とにかく、根本的な原因は無害に見える<base>タグでした:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

<base>ちなみに不要だったタグを削除したところ、正常に動作するようになりました!

于 2013-01-27T17:48:39.003 に答える
0

他の誰かがこの問題に遭遇した場合、AJAX リクエストと通常のフォーム リクエストが送信されるために問題が発生していました。次の行で解決しました:

<form onsubmit="submitfunc(); return false;">

ここで重要なのは return false で、これによりフォームが送信されなくなります。submitfunc() の内部から false を返すこともできますが、明示的に記述した方が明確です。

于 2012-09-07T20:36:45.370 に答える
0

ローカル PC でテストしている場合、動作しません。Ajax の例をテストするには、HTML ファイルを Web サーバーに配置する必要があります。

于 2019-08-15T21:37:19.523 に答える