2011-08-27 12 views
12

私は次のjQueryを使用してGoogle Currency Calculatorとの通貨レートを取得しようとしている(ダミー)コード:起源「のURLは」で許可されていないアクセス制御-起源許可

$.getJSON("http://www.google.com/ig/calculator?hl=en&q=1" + "DOP" + "=?" + "USD", 
     function(data) { 
      $('.currNumber').each(function (index) { 
       $(this).html(parseFloat($(this).html()) * 0.02681); 
            }); 
      }); 

XMLHttpRequestができません負荷http://www.google.com/ig/calculator?hl=en&q=1DOP=?USD。 Origin 'hostURL'は、Access-Control-Allow-Originによって許可されていません。

され、私は、件名に様々な話題を見つけたサイトで探したが、彼らは主にローカルファイルへのアクセスを参照し、追加のパラメータを指定してChromeを起動することによってそれを解決しようとすると(私もクロムを使用しています)が、このような私の問題ではなく、実際にはクロスドメインの制限に関連しているようです。

質問:どうすればjQueryを使用して、そのURLからレートを取得できますか?

+0

可能重複ページへ(http://stackoverflow.com/questions/1051748/cross-domain-scripting-error) – Joe

答えて

17

Ajaxリクエストは、ブラウザのSame Origin Policyによって制限されています。簡単に言えば、スクリプトが実行されているページと同じドメインにないajax経由でサーバーと直接対話することはできません。したがって、google.com用のページを開発している場合を除き、直接google.comと話すことはできません。

スクリプトタグの挿入(スクリプトタグを使用してロードされたJSファイルは同じ発信元ポリシーの対象外です)にJSONPコールバックを使用してデータ結果をメインスクリプトに戻すスクリプトタグ。使用しようとしているAPIがそのAPIをサポートしている場合は、おそらくここで行う必要があります。

jQueryは、自動的にajax呼び出しをスクリプトタグを介してロードされたJSONP呼び出しに変えることができ、クロスドメインの状況でも使用できます。 jQuery doc for it's ajax functionによると、ajax呼び出しのパラメータ文字列に "callback ="がある場合、またはcrossDomainオプションを設定した場合は、自動的にこれが行われます。

+10

私は熟練したWeb開発者ではありません...どうすれば達成できますか? – PedroC88

+1

私の最近の編集内容を詳しく読んでください。 jQueryはほとんどの作業を実行できますが、適切にajax呼び出しを構成する必要があります。 – jfriend00

+0

私はすでに '&callback =? 'を使ってみましたが、'リソースはスクリプトとして解釈されますが、MIMEタイプのテキストhtmlで転送されます。'というメッセージが返されます。これは、テキスト/私は応答を制御できないので、それを修正することはできません...できますか? – PedroC88

2

編集
私はこの問題は何であったか、それは明らかだと思ったが、それはそれはそうここにではないかもしれないようです。あなたが見ているこのエラーは、ドメインがajaxリクエストを介してリソースにアクセスするのを制限するサーバーです。これはstandard JavaScript securityです。あなたのスクリプトは元のドメインとしか話せません。 JavaScriptはGoogleのドメインから読み込まれていないため、ajax経由で計算機APIにアクセスすることが許可されているドメインのリストにないため、このエラーメッセージが表示されます。

jQueryを使用してクロスドメイン要求を行うためのオプションは、outlined hereです。前述のように、JSONPは適切な形式のJSONを返送する必要があるため、サーバーがサポートしている場合にのみ有効なオプションです。


あなたが参照しているページへのリンクを提供すると役立つかもしれません。

このAPIはJSONPをサポートしていません(文書化されていないパラメータがない限り)。これは、サーバーを制御していないため、クロスドメインのajaxリクエストの唯一のオプションですaccess control headersを変更することはできません。

the PHP script hereなどのJavaScriptセキュリティモデルに制約されることなく、このAPIにアクセスするサーバー側のリソースを構築することを検討してください。

+0

リンク[クロスドメインスクリプトエラー?]? JSONレスポンスのものは?それはhttp://www.google.com/ig/calculator?hl = en&q = 1DOP =?USDです。私はwebworksのためにこれも開発しています(これはどんなサーバーでもなくモバイルで実行されます) – PedroC88

+0

@ PedroC88 APIに関する文書はありますか?あなたは、そのテーマに関する様々な話題を見つけたと言います。どこ? –

+0

ブラウザのエラーに関するさまざまな話題は、APIのperseではなく、実際には、私はチームを見つけられませんでした。 – PedroC88

2

これはjfriend00によって先に提供されたhttp://api.jquery.com/jQuery.ajax/のようです。ブール値である "crossDomain"というJQuery ajaxリクエストに含めることができるパラメータについて説明しています。

クロスドメイン(デフォルト:クロスドメインリクエストのため、同じドメインの要求のための偽真) 型:Boolean あなたが同じドメイン上(例えばJSONPなど)クロスドメインリクエストを強制したい場合は、クロスドメインの値を設定します本当に。これにより、たとえば、別のドメインへのサーバー側のリダイレクトが可能になります。 (バージョンが追加されました:1.5)

したがって、これを解決する必要があります(?)。私は専門家ではありませんが、この問題に継続的に挑戦した後に試してみましたが、問題を解決したようです。

例:

$.ajax({ //my ajax request 
     url: "_URL_I_AM_MAKING_REQUEST_TO_", 
     type: "GET", 
     cache: false, 
     dataType: "json", 
     **crossDomain: true,** 
     data: { _mydata_ 
     success : function(response){} 
}); 
+1

これはその物件の目的ではありません。もしあなたがjQueryのドキュメントに書かれていることを読んでいれば、同じドメイン上でcrossDomainリクエスト(JSONPなど)を強制したいのであれば、crossDomainの値をtrueに設定してください。それは同じドメイン要求をクロスドメインのもののように見せると述べている。 – Ian

1

情報のマイナーな追加点。

私は自分のサーバーに投稿しようとするとこのエラーが発生したので、私はこの質問になった。

解決方法:ajax呼び出しでホスト名が一致することを確認してください。

Exmaple:の

//This failed 

$.post("http://domain.com/index.php/count/", 

//This succeeded (the page this was called from was www.domain.com/.....) 

$.post("http://www.domain.com/index.php/count/", 
関連する問題