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。
スクリプトを含むHTMLファイルがファイルスキームを介してブラウザで開かれた場合、ステータスは0です。必ずサーバー(ApacheまたはTomcatのいずれか)にファイルを配置し、ブラウザーでhttpプロトコルを介してファイルを開いてください。 (つまり http://localhost/myfile.html )これが解決策です。
問題の原因は、クロスドメインコールを実行しようとして失敗するです。
ローカルホストの開発をしている場合、クロスドメイン呼び出しを行うことができます-私は常にそれを行います。
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オブジェクトにクロスドメイン機能も追加されましたが、私はまだそれらを使っていません。
実際、ボタンのタイプが「送信しないボタン」であることを確認してください。これにより、最近出会ったステータスの競合が発生しました。
サーバーがOPTIONSメソッドに応答し、GETおよびPOST(どちらを使用している場合でも)に次のようなヘッダーで応答する場合:
Access-Control-Allow-Origin: *
うまくいくかもしれません。 FireFox 3.5およびrekonq 0.4.0のようです。どうやら、そのヘッダーとOPTIONSへの最初の応答で、サーバーはブラウザーに「先に進み、このクロスドメインリクエストを通過させます」と言っています。
要求タイムアウトも考慮してください:
最新のブラウザは、サーバー応答の前に時間がかかりすぎる場合、readyState = 4およびs tatus =を返します。
サーバー応答にsetRequestHeader("Access-Control-Allow-Origin","*")
を追加します。
javascript consoleを開きます。エラーメッセージが表示されます。私の場合、CORSでした。
私は同様の問題に直面していました。 「readystate」は4でしたが、「status」は0でした。ApachePHPポータブルサーバーを使用しており、「XMLHttpRequest」オブジェクトを使用したファイルがhtmlファイル。ファイル拡張子をphpに変更すると、問題は解決しました。
http://127.0.0.1/cd_catalog.xml
が機能するのにhttp://localhost/cd_catalog.xml
が機能しない理由の質問に答えるには、Firefoxは127.0.0.1とlocalhostを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サーバーからエラーゼロがなくなりましたが、それでもコードペンでエラーが発生していました。
に戻る... |その他のツール|開発者ツールはcodepenでエラーを取得しますが、明確に説明されています:codepenはhttpsを使用するため、セキュリティが低いため、httpを呼び出すことができません。
したがって、Webサービスをhttpsでホストする必要があります。
真のエラーメッセージを取得する方法を知る-貴重です!
アレックス・ロビンソンはすでに(そして最初に)この問題に対する正しい答えを与えています。しかし、もう少し詳しく説明するには...
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 により詳しい情報が得られます。
アップロードに固有のstatus === 0
の別のケースを次に示します。
'load'
イベントハンドラーをXHR.upload
にアタッチすると、 MDNが推奨 ( 'Monitoring progress'のアップロード部分にスクロールダウン)として、XHRオブジェクトにはstatus=0
および他のすべてのプロパティは空の文字列になります。コンテンツをダウンロードするときのように、'load'
ハンドラーをXHRオブジェクトに直接アタッチすると、問題ありません(localhostから実行していない場合)。
ただし、'progress'
イベントハンドラーで適切なデータを取得する場合は、XHR.upload
にハンドラーをアタッチする必要があります。notXHRオブジェクト自体に直接。
これまでChrome OSXでしかテストしていませんので、ここで問題のどれだけがMDNのドキュメントにあり、Chromeの実装にどれだけあるかわかりません...
現在のIPアドレスを(もう一度) Atlas MongoDBホワイトリスト に追加する必要があったため、XMLHttpRequestステータス0エラーを取り除きました
これに似た私の問題は、HTMLコードをチェックすることで解決しました。メソッドへのフォーム送信ボタンにonclick
ハンドラーがありました。このような:onclick="sendFalconRequestWithHeaders()"
。このメソッドは、今度はあなたと同じようにajaxを呼び出し、私が望むことをします。しかし、予想どおりではありませんでしたが、私のブラウザーは何も返していませんでした。
Learned From someone's hardwork 、このハンドラーでfalseを返し、解決しました。この投稿に到着する前に、私は3週間の週末とオフィスでCORS filters
、jetty config
、その他のjersey and embedded jetty
関連のものを実装するコードを書くのに半日費やしましたこれを修正するには、cross domain ajax requests
および標準的なものに関する私のすべての理解を回転させます。 javascriptの単純な間違いがいかに愚かであるかはばかげていました。
本当は、signed.applets.codebase_principal_support = true
を試し、isLocalHost() **if**
と書いた。このメソッドは私たちが実装する必要があるかもしれませんが、firefoxはそのようなものはないと言います。その誰かに感謝します。
Alex Robinsonとbmjuは、起源を超えた問題を理解するための貴重な情報を提供しました。希望するGET/POSTを行う前に、クライアントコードで明示的なOPTIONS呼び出しを行う必要がある場合があることを付け加えました(たとえば、CORS OAuthサービスエンドポイントに対して)。ブラウザ/ライブラリがOPTIONSリクエストを自動的に処理しない場合があります。 Gruber、これはあなたの質問に対する可能な答えの一つです。
0.0.0.0
をサーバーとして使用し、localhost
に変更したため、この問題が発生しました。
私は同じ問題を抱えていました(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);
});
});
ブラウザ要求「127.0.0.1/somefile.html」は変更されずにローカルWebサーバーに到着し、「localhost/somefile.html」は「0:0:0:0:0:0:0:1/somefile.html」として到着する場合があります"IPv6がサポートされている場合。したがって、後者は、ドメインから別のドメインに移動するように処理できます。