web-dev-qa-db-ja.com

XMLHttpRequestからの空のresponseText

正常に実行されますが、空のresponseTextを返すXMLHttpRequestを作成しました。

Javascriptは次のとおりです。

  var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
  var myRequest = new XMLHttpRequest();

  callAjax(anUrl);

  function callAjax(url) {
     myRequest.open("GET", url, true);
     myRequest.onreadystatechange = responseAjax;
                 myRequest.setRequestHeader("Cache-Control", "no-cache");
     myRequest.send(null);
  }

  function responseAjax() {
     if(myRequest.readyState == 4) {
        if(myRequest.status == 200) {
            result = myRequest.responseText;
            alert(result);
            alert("we made it");
        } else {
            alert( " An error has occurred: " + myRequest.statusText);
        }
     }
  }

コードは正常に実行されます。私は歩き回って、readyState == 4とstatus == 200を取得しますが、responseTextは常に空白です。

エラーディスパッチ:getPropertiesのログエラー(Safariデバッグ)が表示されますが、参照が見つからないようです。

SafariとFirefoxでローカルとリモートサーバーの両方でコードを実行しました。

URLをブラウザに入力すると、文字列が返され、ステータスコード200が返されます。

Mac Widgetで同じURLに同様のコードを記述しましたが、これは正常に動作しますが、ブラウザーの同じコードで結果が返されることはありません。

27
PurplePilot

http://api.xxx.com/ドメインの一部ですか?そうでない場合は、 同じオリジンポリシー によってブロックされています。

考えられるいくつかの回避策については、次のStack Overflowの投稿をご覧ください。

26
Daniel Vassallo

問題が解決しました

私の場合、問題は、URLパラメーターにfull pathを使用してajax呼び出し(jQueryの$ .ajax、$。getまたは$ .getJSONメソッドを使用)を行うことでした。

url: " http://mydomain.com/site/cgi-bin/serverApp.php "

ただし、正しい方法は、urlの値を次のように渡すことです。

url: "site/cgi-bin/serverApp.php"

一部のブラウザは競合せず、テキスト間で区別を行いませんが、Firefox 3.6 for Mac OSでは、このフルパスを "として取ります。クロスサイトスクリプティング "...別のこと、同じブラウザには次のような違いがあります。

http://mydomain.com/site/index.html

そして、置きます

http://www.mydomain.com/site/index.html

実際、それは正しいポイントビューですが、ほとんどの実装は区別しないため、解決策は、メソッドのスクリプトへのフルパスを指定するすべてのテキストを削除することでしたajaxリクエスト[〜#〜] and [〜#〜].... remove[〜# 〜.base [〜#〜]index.htmlファイルのタグ

base href = "http://mydomain.com/" <---悪い考えです、削除してください!

削除しない場合、このシステムのこのバージョンのブラウザは、クロスサイトリクエストのようにajaxリクエストを受け取る可能性があります。

私は同じ問題を抱えていますが、Mac OSマシンのみです。問題は、Firefoxがajax応答を「クロスサイト」呼び出しとして扱うことです。他のマシン/ブラウザーでは、それは正常に動作します。私はこれについて何も助けを見つけませんでした(これはfirefoxの実装の問題だと思います)が、サーバー側で次のコードを証明するつもりです。

header('Content-type: application/json');

ブラウザがデータを「json data」として取得することを確認するには...

12
Ivan David

ブラウザがクロスサイトスクリプティングを妨げています。

URLがドメイン外にある場合は、サーバー側でこれを行うか、ドメインに移動する必要があります。

4
Jacob Relkin

これは最善の方法ではないかもしれません。しかし、それはどういうわけか私のために働いたので、私はそれで走るつもりです。

データを返すphp関数で、戻り行の1行前に、echoステートメントを追加して、送信するデータをエコーし​​ます。

なぜそれが機能したのかは確かですが、実際に機能しました。

1
swl1020

あなたと同様の問題がありました。ここで必要なことは、ここにあるdocument.domainソリューションを使用することです。

同一起源ポリシーを回避する方法

また、Webサービス側でシンを変更する必要がありました。ここにある「Access-Control-Allow-Origin」ヘッダーを使用しました。

https://developer.mozilla.org/En/HTTP_access_control

0
wkm