web-dev-qa-db-ja.com

HTTPリクエストがステータスコード0を返すとはどういう意味ですか?

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

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

テストとして、ネットワークのプラグを完全に抜いてみました。無関係かもしれませんが、その結果、ステータスコード17003(IIRC)が発生しました。

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

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

107
mike nelson

エラーコードは、応答が空だったことを示していると思います(ヘッダーが返されなかったため)。これは、接続が受け入れられてから正常に閉じられたことを意味します(TCP FIN)。これを引き起こす可能性のあるものは多数ありますが、説明から判断すると、何らかの形のファイアウォールが最も可能性の高い犯人のようです。

49
Nick

ここでの回答の多くは間違っています。人々は特定のケースでstatus == 0の原因を理解し、それを回答として一般化しているようです。

実際には、失敗したXmlHttpRequestのstatus == 0は、未定義のエラーと見なされる必要があります。

実際のW3C仕様は、ここにゼロが返される条件を定義します。 https://fetch.spec.whatwg.org/#concept-network-error

仕様(fetchまたはXmlHttpRequest)からわかるように、このコードは、サーバーに接続する前に発生したエラーの結果である可能性があります。

このステータスコードを生成する一般的な状況のいくつかは、他の回答に反映されますが、これらの問題のいずれかまたはまったくない可能性があります。

  1. 不正なクロスオリジンリクエスト( CORS を参照)
  2. ファイアウォールのブロックまたはフィルタリング
  3. リクエスト自体はコードでキャンセルされました
  4. インストールされたブラウザ拡張機能が物事を台無しにしている

ブラウザがこれらのstatus == 0シナリオの詳細について詳細なエラーレポートを提供すると役立つと思います。実際、status == 0が役立つコンソールメッセージを伴う場合がありますが、他の情報がない場合もあります。

166
whitneyland

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

あなたが使用しているのと同じ技術スタックではありませんが、誰かに役立つことを願っています。

34
Cory R. King

wininet.dllは、以下にリストされている標準および非標準の両方のステータスコードを返します。

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

ステータスコード「ゼロ」の場合、Webサーバーで実行されているローカルWebページまたはWebサーバーなしでリクエストを実行しようとしていますか?

XMLHttpRequest status = 0およびXMLHttpRequest statusText = unknownは、Webサーバーでスクリプトを実行していない場合に役立ちます。

13

回避策:私たちがやったこと

ファイアウォールの問題に関係していると考えたため、トリックを実行する回避策を思い付きました。同じ問題が発生した場合は、次のようにします。

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

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

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

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

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

6
mike nelson

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

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

XHRアボート: 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ではエラーコールバックに渡されるtextStatusは中止されると「中止」されますタイムアウト付きの「タイムアウト」が発生します。 Zepto(jQueryと非常によく似ています)を使用している場合、errorTypeは、中止されると「エラー」になり、タイムアウトが発生すると「タイムアウト」になります。

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);
4
Cory Danielson

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

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

1)このchrome拡張機能、 Requestly を使用して、URLのhttpsバージョンからhttpバージョンにリダイレクトします。これにより、このアプローチの利点は、アプリをまったく変更する必要がなく、この拡張機能を使用してURLを「書き換える」ことができることです。

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

3
Brad Parks

私の場合、ドメインの前にWWWを置くのを忘れるとステータスが0になりました。私のすべてのajaxリクエストはhttp:/WWW.mydomain.comにハードコードされており、ロードされるWebページは http://mydomain.com であるため、ドメインが異なるためセキュリティの問題になりました。 .htaccessファイルでリダイレクトを実行して、常にwwwを先頭に配置しました。

2

Lee's answer に加えて、 synchronous リクエストに切り替えると、実際の原因に関する詳細情報を見つけることができます。例外も発生します。

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

例えば ​​:

NetworkError:ネットワークエラーが発生しました。

1
McX

ステータス== 0の新しい文書化されていない理由を見つけました。

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

クロスオリジン、ネットワーク、またはキャンセルされたリクエスト(コードまたはユーザーナビゲーションによる)ではありませんでした。開発者コンソールまたはネットワークログには何もありません。

State()に関するドキュメントはほとんど見つかりませんでした(Mozillaはリストしていませんが、W3Cはリストしています)。

それは私の広告ブロッカー(FirefoxのuBlock Origin)でした。

1
Jonathan Amend

私の場合は、same-Origin policyが原因で、AJAX呼び出しがブラウザーによってブロックされていたためです。私のすべてのHTMLとスクリプトは127.0.0.1から提供されるため、これは最も予想されていなかったものでした。どのようにしてそれらは異なる起源を持っていると考えられますか?

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

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

<base>タグを削除しましたが、これは必要ありませんでしたが、現在は正常に機能します!

1
Saintali

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

0
ExcelinEfendisi

Nginxのclient_max_body_sizeディレクティブを超えるajaxファイルのアップロードは、このエラーコードを返すことに注意してください。

0
r3wt

誰かがこの問題に出くわした場合、これはAJAXリクエストと通常のフォームリクエストが送信されるために問題を引き起こしていました。私は次の行でそれを解決しました:

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

キーはfalseを返すため、フォームは送信されません。 submitfunc()の内部からfalseを返すこともできますが、明示的に記述したほうがわかりやすいと思います。

0
samoz