web-dev-qa-db-ja.com

XMLHttpRequestステータス0(responseTextは空です)

XMLHttpRequestでデータを取得できません(ステータス0およびresponseTextが空です):

 xmlhttp = new XMLHttpRequest(); 
 xmlhttp.open( "GET"、 "http://www.w3schools.com/XML/cd_catalog.xml"、true); 
 xmlhttp.onreadystatechange = function()
 {
 if(xmlhttp.readyState == 4)
 alert( "status" + xmlhttp.status); 
} 
 xmlhttp.send(); 

「ステータス0」を警告します。

Localhostリクエストと同じ状況(cd_catalog.xmlはローカルファイルとして保存されます)

 xmlhttp.open( "GET"、 "http://localhost/cd_catalog.xml"、true); 

ただし、localhost IPリクエストでは

 xmlhttp.open( "GET"、 "http://127.0.0.1/cd_catalog.xml"、true); 

そして、ローカルファイルリクエストで

 xmlhttp.open( "GET"、 "cd_catalog.xml"、true); 

すべて問題ありません(ステータス200)

オンラインリクエストで何が問題(status = 0)を引き起こす可能性がありますか?

PS:ライブHTTPヘッダーは、4つのケースすべてで問題がないことを示しています。

 HTTP/1.1 200 OK 
 Content-Length:4742 

PS2:VMWare上のApacheローカルWebサーバー(ホストOS Win7、ゲストOS Ubuntu、ネットワークアダプター– NAT)。ブラウザ– Firefox。

92
arigasa

スクリプトを含むHTMLファイルがファイルスキームを介してブラウザで開かれた場合、ステータスは0です。必ずサーバー(ApacheまたはTomcatのいずれか)にファイルを配置し、ブラウザーでhttpプロトコルを介してファイルを開いてください。 (つまり http://localhost/myfile.html )これが解決策です。

41
Abhishek_8

問題の原因は、クロスドメインコールを実行しようとして失敗するです。

ローカルホストの開発をしている場合、クロスドメイン呼び出しを行うことができます-私は常にそれを行います。

Firefoxの場合、構成設定で有効にする必要があります

signed.applets.codebase_principal_support = true

次に、XHRオープンコードに次のようなものを追加します。

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

IEの場合、覚えているなら、あなたがしなければならないことは、ブラウザのセキュリティ設定を「その他」→「ドメイン全体のデータソースにアクセス」で有効にして、ActiveX XHRで動作させることだけです。

IE8以上では、ネイティブのXmlHttpRequestオブジェクトにクロスドメイン機能も追加されましたが、私はまだそれらを使っていません。

28
Slammer

実際、ボタンのタイプが「送信しないボタン」であることを確認してください。これにより、最近出会ったステータスの競合が発生しました。

25
dyuan

サーバーがOPTIONSメソッドに応答し、GETおよびPOST(どちらを使用している場合でも)に次のようなヘッダーで応答する場合:

Access-Control-Allow-Origin: *

うまくいくかもしれません。 FireFox 3.5およびrekonq 0.4.0のようです。どうやら、そのヘッダーとOPTIONSへの最初の応答で、サーバーはブラウザーに「先に進み、このクロスドメインリクエストを通過させます」と言っています。

17
Alex Robinson

要求タイムアウトも考慮してください:

最新のブラウザは、サーバー応答の前に時間がかかりすぎる場合、readyState = 4およびs tatus =を返します。

9

サーバー応答にsetRequestHeader("Access-Control-Allow-Origin","*")を追加します。

6
Ivan

javascript consoleを開きます。エラーメッセージが表示されます。私の場合、CORSでした。

3
Jarekczek

私は同様の問題に直面していました。 「readystate」は4でしたが、「status」は0でした。ApachePHPポータブルサーバーを使用しており、「XMLHttpRequest」オブジェクトを使用したファイルがhtmlファイル。ファイル拡張子をphpに変更すると、問題は解決しました。

3
Reyan

http://127.0.0.1/cd_catalog.xmlが機能するのにhttp://localhost/cd_catalog.xmlが機能しない理由の質問に答えるには、Firefoxは127.0.0.1とlocalhostを2つの異なるドメインとして扱います。

2
Tomi Aarnio

問題が何であるかを確認するには、不可解なエラー0が表示されたら...に移動します。その他のツール| Chromeの開発者ツール(Ctrl + Shift + I)(エラーが発生しているページ)

ログの赤いテキストを読んで、真のエラーメッセージを取得してください。そこに多すぎる場合は、右クリックしてコンソールをクリアし、最後のリクエストを再度実行します。

私の最初の問題は、ブラウザー用に自分のクロスドメインWebサービスにAuthorizationヘッダーを初めて渡すことでした。

私はすでに持っていた:

Access-Control-Allow-Origin: *

だがしかし:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization

私のWebサービスの応答ヘッダーに。

それを追加した後、Webサーバーなしでindex.htmlファイルをローカルで実行したときと同様に、自分のWebサーバーからエラーゼロがなくなりましたが、それでもコードペンでエラーが発生していました。

に戻る... |その他のツール|開発者ツールはcodepenでエラーを取得しますが、明確に説明されています:codepenはhttpsを使用するため、セキュリティが低いため、httpを呼び出すことができません。

したがって、Webサービスをhttpsでホストする必要があります。

真のエラーメッセージを取得する方法を知る-貴重です!

2
Maya

アレックス・ロビンソンはすでに(そして最初に)この問題に対する正しい答えを与えています。しかし、もう少し詳しく説明するには...

HTTP応答ヘッダーを追加する必要があります。

Access-Control-Allow-Origin: *

これを行うと、結果は「うまくいく」だけでなく、「うまくいく」ことになります。

注:追加する必要があるのは、HTTPresponseヘッダーです。これは、制御するサーバーでのみ実行できます。そのリソースはXMLHttpRequestを使用して元のURLから http://w3schools.com/XML/cd_catalog.xml を直接取得することは決してできません(OPの質問による)。 (少なくとも、2015年4月24日の時点では)CORSヘッダーは含まれません。

http://en.wikipedia.org/wiki/Cross-Origin_resource_sharing により詳しい情報が得られます。

1
Mike Beaton

アップロードに固有のstatus === 0の別のケースを次に示します。

'load'イベントハンドラーをXHR.uploadにアタッチすると、 MDNが推奨 ( 'Monitoring progress'のアップロード部分にスクロールダウン)として、XHRオブジェクトにはstatus=0および他のすべてのプロパティは空の文字列になります。コンテンツをダウンロードするときのように、'load'ハンドラーをXHRオブジェクトに直接アタッチすると、問題ありません(localhostから実行していない場合)。

ただし、'progress'イベントハンドラーで適切なデータを取得する場合は、XHR.uploadにハンドラーをアタッチする必要があります。notXHRオブジェクト自体に直接。

これまでChrome OSXでしかテストしていませんので、ここで問題のどれだけがMDNのドキュメントにあり、Chromeの実装にどれだけあるかわかりません...

1
ericsoco

現在のIPアドレスを(もう一度) Atlas MongoDBホワイトリスト に追加する必要があったため、XMLHttpRequestステータス0エラーを取り除きました

0
Anja

これに似た私の問題は、HTMLコードをチェックすることで解決しました。メソッドへのフォーム送信ボタンにonclickハンドラーがありました。このような:onclick="sendFalconRequestWithHeaders()"。このメソッドは、今度はあなたと同じようにajaxを呼び出し、私が望むことをします。しかし、予想どおりではありませんでしたが、私のブラウザーは何も返していませんでした。

Learned From someone's hardwork 、このハンドラーでfalseを返し、解決しました。この投稿に到着する前に、私は3週間の週末とオフィスでCORS filtersjetty config、その他のjersey and embedded jetty関連のものを実装するコードを書くのに半日費やしましたこれを修正するには、cross domain ajax requestsおよび標準的なものに関する私のすべての理解を回転させます。 javascriptの単純な間違いがいかに愚かであるかはばかげていました。

本当は、signed.applets.codebase_principal_support = trueを試し、isLocalHost() **if**と書いた。このメソッドは私たちが実装する必要があるかもしれませんが、firefoxはそのようなものはないと言います。その誰かに感謝します。

0
Siva Tumma

Alex Robinsonとbmjuは、起源を超えた問題を理解するための貴重な情報を提供しました。希望するGET/POSTを行う前に、クライアントコードで明示的なOPTIONS呼び出しを行う必要がある場合があることを付け加えました(たとえば、CORS OAuthサービスエンドポイントに対して)。ブラウザ/ライブラリがOPTIONSリクエストを自動的に処理しない場合があります。 Gruber、これはあなたの質問に対する可能な答えの一つです。

0
Tim McConnell

0.0.0.0をサーバーとして使用し、localhostに変更したため、この問題が発生しました。

0
Vad

私は同じ問題を抱えていました(readyStateは4でステータス0)、その後、このチュートリアルで説明されている別のアプローチに従いました: https:/ /spring.io/guides/gs/consuming-rest-jquery/

彼はXMLHttpRequestをまったく使用せず、代わりにjquery $ .ajax()メソッド:

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="hello.js"></script>
</head>

<body>
    <div>
        <p class="greeting-id">The ID is </p>
        <p class="greeting-content">The content is </p>
    </div>
</body>

public/hello.jsファイルの場合(または同じHTMLコードに直接挿入することもできます):

$(document).ready(function() 
 {
    $.ajax({
        url: "http://rest-service.guides.spring.io/greeting"
   }).then(function(data) {
      $('.greeting-id').append(data.id);
      $('.greeting-content').append(data.content);
   });
 });
0
RMDev

ブラウザ要求「127.0.0.1/somefile.html」は変更されずにローカルWebサーバーに到着し、「localhost/somefile.html」は「0:0:0:0:0:0:0:1/somefile.html」として到着する場合があります"IPv6がサポートされている場合。したがって、後者は、ドメインから別のドメインに移動するように処理できます。

0
Massimo Roscio