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


104

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( "ステータス" + 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
  コンテンツの長さ:4742

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


1
http://127.0.0.1万が一、テストページになっていますか?;)
Roatin Marth、2011

はい。<code> 127.0.0.1/CDCatalogTest.html </ code>
arigasa

7
あなたはあなたの質問に答えました。XMLHttpRequestクロスドメインリクエストは実行できません。ただし、いくつかの回避策があります。たとえば、jqueryを見てください。
メゼ

phpを使用してファイルを取得します。少しの回避jquery-howto.blogspot.com/2009/04/…

2
@meze:クロスドメイン呼び出しはjQueryで機能します。しかし、jQueryはJavaScriptで実装されているため、プレーンなJavaScriptでは動作しません。それは私には意味がありません。jQueryはある種の厄介な回避策を使用していますか?
グルーバー

回答:


55

スクリプトを含むhtmlファイルがファイルスキームを介してブラウザで開かれると、ステータスは0になります。必ずファイルをサーバー(apacheまたはtomcatなど)に配置し、ブラウザーでhttpプロトコルを介して開きます。(すなわち http://localhost/myfile.html)これが解決策です。


1
なぜこれが反対投票されるのですか?それは本当です!file:// URL上のfile:// URLからのXHRリクエストは、実際には成功時にステータス== 0になります(FF 24.0.5でテスト済み)。
Daniel Roethlisberger 2014

3
Safariバージョン6.1.6で成功すると、ステータス== 0も表示されます。
Planar

firefoxでLoad一時アドオンを使用して、ステータス= 0(ただし、ネットワークではステータス200)を使用しています
JobaDiniz '22

1
まだ有効な答え。HTTP応答は、実際のリモートスキーム(httpなど)では200、ローカルファイル(file://スキーム)では0です。明らかに、CORSを無効にして、最初にローカルファイルの読み込みを許可する必要があります。
pid

31

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

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

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オブジェクトにクロスドメイン機能も追加されましたが、まだそれらを操作していません。


8
だれかがそれを必要とする場合、Chromeの場合は(まだ開いていない状態で)新しいインスタンスを起動して使用する必要があります--allow-file-access-from-files
TheZ

@TheZ:あなたは100%ですか?Chromeの新しいインスタンスを--allow-file-access-from-filesスイッチで実行するだけでよいと聞きましたが、実行中の他のすべてのインスタンス閉じる必要はありませんChromeシークレットモードの場合とまったく同じです。実行中の他のインスタンスを閉じることなく使用できます。
trejder 2013

「UniversalBrowserRead」のサポートが廃止されたようですので、この回避策はオプションではありません。
perilandmishap 2015年

また、(ブラウザ内拡張のように)httpsページからhttpページをリクエストしたときにも発生する可能性があります。
sibvic 2018年

同じページにあるHTMLページとAJAXスクリプトにもかかわらず、この問題が発生しています。しかし奇妙なことに、これは一部のスクリプト、特にMongoDBリソースにアクセスするすべてのスクリプトにのみ影響を及ぼします。これがなぜであるかについての手がかりはありますか?
デビッドエドワーズ

26

実際にボタンタイプが[送信しないボタン]であることを確認してください。


1
フォームの送信にはデフォルトの動作がいくつかあるため、競合が発生します。イベントを処理してajax呼び出しを自分で行う場合は、これを防ぐ必要があります。ハンドラーでイベントを取得して呼び出すことにより、デフォルトの動作を防ぐことができますe.preventDefault()
ジョーダン

20

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

Access-Control-Allow-Origin: *

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


3
これが正解です。詳細については、en.wikipedia.org / wiki / Cross-origin_resource_sharingをご覧ください。このヘッダーを追加した場合、「うまくいく」ではなく「うまくいく」でしょう。注意:追加する必要があるのはHTTP / response /ヘッダーです。そのため、これは自分が制御するサーバーでのみ実行できます。そのリソースには(少なくとも2015年4月24日現在)このようなCORSヘッダーが含まれていないため、(つまり、元の質問に従って)を使用してw3schools.com/XML/cd_catalog.xmlを直接フェッチすることはできXMLHttpRequestません。
MikeBeaton

13

リクエストのタイムアウトも考慮してください

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


3
@AndreaSavojardo:この動作が標準に準拠しているかどうかについて(MDNへの投稿のような)参照はありますか?
Alexander Abakumov

@AndreaSavojardo readyState = 4とstatus = 0があり、サーバーは実行されていませんが、エラーのアラートがすぐに表示されます。

7

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


3

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


3

JavaScriptコンソールを開きます。そこにエラーメッセージが表示されます。私の場合、それはCORSでした。


2

なぜhttp://127.0.0.1/cd_catalog.xml動作 http://localhost/cd_catalog.xmlしないのかという疑問に答えるために、Firefoxは127.0.0.1とlocalhostを2つの異なるドメインとして扱っています。


2

問題が何であるかを確認するには、不可解なエラー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サーバーからエラー0がなくなりましたが、それでもコードペンでエラーが発生していました。

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

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

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


私はこのアプローチ(ChromeのF12)を使用して、httpsからhttpに移動しようとしているのに気づきました。 エラーメッセージ:VM1152:1混合コンテンツ:のページは'https://mysiteoriginsite' HTTPS経由でロードされましたが、安全でないXMLHttpRequestエンドポイントを要求しました'http://MyDestinationSite/MyService.svc'。このリクエストはブロックされました。コンテンツはHTTPS経由で提供する必要があります。
GrayDwarf

1

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

MDNで提案されているように(「進行状況の監視」のアップロード部分にスクロールダウンして)'load'イベントハンドラーをにアタッチすると、XHRオブジェクトが保持され、他のすべてのプロパティは空の文字列になります。コンテンツをダウンロードするときのように、ハンドラーをXHRオブジェクトに直接アタッチする場合は、問題ありません(localhostで実行していなければ)。XHR.uploadstatus=0'load'

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

私はこれまでChrome OSXでのみテストしたので、ここでの問題のどの程度がMDNのドキュメントであり、Chromeの実装がどれくらいであるかはわかりません...


1

Alex Robinsonはすでに(そして最初に)この問題に対する正しい答えを提供しています。しかし、もう少し詳しく説明すると...

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

Access-Control-Allow-Origin: *

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

注意:追加する必要があるのはHTTP 応答ヘッダーです。そのため、これを制御できるサーバーでのみ実行できます。を使用して元のURLからhttp://w3schools.com/XML/cd_catalog.xmlを直接フェッチすることはできませんXMLHttpRequest(OPの質問に従って)ません。なぜなら、そのリソースは(少なくとも、2015年4月24日以降は)不可能だからです。そのようなCORSヘッダーを含めます。

詳細については、http://en.wikipedia.org/wiki/Cross-origin_resource_sharingを参照してください。


0

これに似た私の問題は、htmlコードをチェックすることで解決しました。onclickメソッドへのフォーム送信ボタンにハンドラーがありました。このような:onclick="sendFalconRequestWithHeaders()"。このメソッドは次に、あなたと同じようにajaxを呼び出し、私がやりたいことを行います。しかし、期待どおりではなかったが、私のブラウザは何も返さなかった。

誰かの勤勉さから、私はこのハンドラーでfalseを返し、解決しました。この投稿に到達する前に、私は3日間の週末と半日をオフィスCORS filtersjetty config、その他のjersey and embedded jetty関連するものを実装するコードを書くのに費やしましたcross domain ajax requests。JavaScriptの単純な間違いがあなたを馬鹿にする方法はばかげていました。

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


0

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


0

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


0

私は同じ問題を抱えていました(readyStateは4で、ステータスは0でした)。次に、このチュートリアルで説明されている別のアプローチに従いました。 https //spring.io/guides/gs/sumption-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);
   });
 });

2
jQuery が内部で$.ajax()使用XMLHttpRequestしていることにお気づきでしょうか。
Manngo 2018


-1

0.0.0.0は自分のサーバーとして使用し、それをに変更して機能したため、この問題が発生しましたlocalhost


-4

編集:この回答の知識は古くなっているので、以下のMalvolioのコメントを読んでください。

クロスドメインXMLHttpRequestsは実行できません。

呼び出し127.0.0.1テストページは次の場所にありますので、作品127.0.0.1、よく...それは地元のテストだ、以来、地元のテストも動作します。

他の2つのテストは、JavaScriptがXMLHttpRequestを介して遠隔サーバーと通信できないため失敗します。

代わりに次のいずれかを検討できます。

  • XMLHttp-独自のサーバーにリモートXMLコンテンツを取得するよう要求する(phpスクリプトなど)
  • 完全なJavaScriptを維持したい場合に、GoogleAppEngineなどのサービスを使用しようとしています。

それが役に立てば幸い


40
これは間違っています。あなたはできるクロスドメインのXMLHttpRequestsを行います。
Malvolio、2012年

1
「できません」のように「それは決して良い考えではないので、行うべきではありません」
ガブリエルスプレンジャー2012

24
-十分に公平ですが、コメントがそのための最良のフォーラムであるかどうかはわかりません。クロスドメインXMLHttpRequestsには確かにいくつかのセキュリティ上の課題がありますが、それらはそれらの課題に対処するために必要なすべてのツールを提供します。それはさておき、それらはウェブサイトが他のウェブサイトに簡単にサービスを提供することを可能にし、データを伝搬するためにCDNを使用し、そしてユーザーのリクエストにより迅速に応答することを可能にします。特定の質問がある場合は、私にメッセージを送ることができます。それ以上に、SOに質問を投稿して、私の注意を引くことができます。
Malvolio、2012

2
@GabrielSprenger:クロスドメインXMLHttpRequestsは良いアイデアであるだけでなく、最近では一般的であるので、(ある種のHelloWorldsを超えて)最新のWebアプリでそれらを実行しないことは、とんでもないことです。アプリが使用する外部RESTサービスには、クロスドメインが必要です XMLHttpRequest。そして、それが、すべてのCORSのものが追加された理由です。
アレクサンダーアバクモフ2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.