1

私は、openstreetmap API(http://wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.6)からデータをロードするjavascriptアプリケーションを作成しようとしています。これは、基本的には単なる安らかなxmlAPIです。jqueryを使用してXMlにアクセスしようとしています。ただし、セキュリティエラーが発生します。これはクロスサイトスクリプティングのブロックです。

そのXMLにアクセスするにはどうすればよいですか?AFAIK OSMはjsonpを提供していないため、機能しません。とにかくありますか?>

4

3 に答える 3

2

クロスサイトスクリプティングを回避する2つの方法は、サーバー側のプロキシを呼び出すスクリプトでURLを呼び出すようにサーバー側のプロキシを設定することです。もう1つの方法は、クロスサイト呼び出しに制限のないスクリプトタグを使用してデータを呼び出すことです。

于 2009-07-19T16:30:05.727 に答える
1

ダンによってリンクされたブログ投稿は、この問題を解決する方法を示していますが、背景は次のとおりです。

WebページからクロスドメインJavascript呼び出しを行うことができる唯一の方法は、JSONPを介することです。JSONPが提供されていない場合は、プロキシスクリプトを使用する必要があります。これは、ブラウザがサイトスクリプトによるそのような呼び出しを意図的に防止しているためです。

Firefox拡張機能を作成している場合は、特権スペースで実行しているため、制限なしでそのようなクロスドメイン呼び出しを行うことができることに注意してください。

于 2009-07-19T16:33:46.750 に答える
1

OpenStreetMapのNominatimAPIはJSONPをサポートするようになったため、独自のサーバーに余分なものを必要とせずに、純粋にクライアント側のコードでデータを取得できます。これがjsfiddleです-jsfiddleで実行できる場合は、どこでも実行できます。

他のドメインからAPIにアクセスする方法に関するより一般的な質問については、部分的に完全で、多くの場合矛盾する多くの回答を試行錯誤しながら学んだいくつかの有用なことを次に示します。不正確な点や不正確な点がある場合は、編集またはコメントしてください。

  • JSONPをサポートするAPIを使用できない場合は、YQLなどを使用してjquery-xdomain-ajaxなどのプラグインを調べ、それらがどのように機能するかを理解する必要があります。一般に、これらのプラグインは、APIのクエリよりもHTMLの読み取りに適しているようです。
  • APIに直接アクセスできるようにするには、a)JSONで結果を提供し、b)JSONPサポートが組み込まれている必要があります。
    • APIは、結果をラップする関数の名前を指定するパラメーターをリッスンするように設定する必要があります
    • そのパラメータが何と呼ばれるかを知る必要があります。OSMの場合、これは呼び出されjson_callbackます。jQueryのデフォルトcallbackは、APIがリッスンするようにプログラムされている場合にのみ機能します。
    • jQueryでは、このAPI固有のパラメーターキーがクエリURLの最後に配置されます?(たとえば、の場合json_callbacksomeurl.com/api?json_callback=?)。jQueryはこれが何であるかを理解し、?をのような文字列と交換しjQuery1712164863864387412、インライン関数に同じ文字列の名前を付け、その関数を名前でトリガーしてJSONを渡すコードを受け取るのを待ちます。
      • リクエストは機能するがコールバックが起動せず、のようなエラーが表示されるparseerror jQuery17109935275333671539_1300495251986 was not called場合、jQueryには、readyとwaitingという名前の関数がありますが、APIはその文字列を使用してJSONをラップしていないため、関数は呼び出されません-おそらく正しいパラメータ名を使用していないことを意味します
    • jQueryがない場合は、そのパラメーターキーに、JSONを受け取る名前付き関数の名前を渡す必要があります。
  • 基本的に発生しているのはブラウザが読み込まれていることだけなので、と同等のjavascriptコードのスニペットを制御された方法で実行するため、エラー処理は制限されます(ただし、簡略化されたショートカットの代わりに完全な構文someFunction({"some": "argument"});を使用する場合、jQueryが提供するものについてはjsfiddleを参照してください)$.ajax$.getJSON
  • 私にとってFirebugでは、少なくともJSONPリクエストは他のAJAX呼び出しのようにコンソールに表示されず、むしろNETパネルの下部に表示されます(内部的には、本質的には逆方向の読み込み方法であるため)コード、sayのように処理されます<script>)。

うまくいけば、これは誰かを助けるでしょう!

于 2012-03-05T00:26:26.447 に答える