0

私はWeb開発を学んでおり、RESTAPIを介してMongoLabでホストされているMongoDBデータベースにクエリを実行するためのajaxリクエストを作成しようとしています。私のコードは非常に単純ですが、ajaxリクエストが常にエラーになる理由がわかりません。ヘルプ?

<doctype html>
<html>
<head>
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="http://code.jquery.com/jquery-migrate-1.1.0.min.js"></script>

    <title>Data Viewer</title>
</head>
<body>
    <form id="the_form" method="post">
        <input type="submit" value="Go" />
    </form>

    <script>
        $(function() {
            $('#the_form').submit(function() {
                $.ajax({
                    url: 'https://api.mongolab.com/api/1/databases/omnitor-android/collections/logs?apiKey=[some API key in here]',
                    type: 'GET',
                    success: function(data) {
                        alert(data);
                    },
                    error: function() {
                        alert("boom");
                    }
                });
            });
        });
    </script>
</body>
</html>
4

5 に答える 5

3

これは、異なるドメインでホストされているサービスを呼び出そうとしているためです。同一生成元ポリシーのため、Ajaxはクロスドメインリクエストを許可していません。ajaxを使用して外部サイトを呼び出すことはできません。本当に使いたいのなら、JSONPを使わなければなりません。または、これにサーバーサイドプロキシを使用できます。つまり、サーバー側で外部サイトを呼び出し、そのWebサービスに対してajax呼び出しを実行します。

クロスドメインajaxリクエストを実行する方法の詳細については、このリンクをたどってください。

于 2013-02-06T06:03:46.230 に答える
2

MongoLab REST APIはCORSを完全にサポートしているため、ほとんどのブラウザーは問題なくCORSにリクエストを送信できるはずです。これをjsコードの先頭に追加してみてください。

$.support.cors = true;

ほとんどのブラウザ(FireBugなど)に組み込まれているデバッグコンソールを使用してみましたか?そこで、より詳細なエラーメッセージを見つけることができるかもしれません。

また、support@mongolab.comまでお気軽にお問い合わせください。

于 2013-02-06T19:25:37.003 に答える
0

ajaxリクエストに同一生成元ポリシーの制約が課せられているため、機能していません。同一生成元ポリシーは、ブラウザがクロスドメインリクエストを行うことを防ぎます。

この問題の解決策は、jsonpを使用することです。ほとんどのAPIプロバイダーはこれをサポートしており、jQueryなどのライブラリもこのプロトコルをサポートしています。

ブラウザコンソールを調べると、次のようなものが見つかります。

Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.

次のようにjQuery.getJson()を使用できます

$.getJSON('https://api.mongolab.com/api/1/databases/omnitor-android/collections/logs?apiKey=[some API key in here]?callback=?', function(data) {
    console.log('xx')
});
于 2013-02-06T06:14:06.613 に答える
0

MongolabはCORSをサポートしています。これは、IE *とOpera( http://caniuse.com/cors )ではあまりサポートされないことを意味します。CORSをサポートするブラウザで使用するには、jQueryajaxリクエストでdataTypeを「json」に設定していることを確認する必要があります。

      $.ajax(
            {
                url         : url
            ,   type        : "GET"
            ,   dataType    : "json"
            ,   success     : function( data )
                {
                    // do something
                }
            });

より多くのブラウザサポートについては、単純なプロキシ(たとえば、PHP)を使用することをお勧めします。あなたは次のようなものを使うことができます。

var xhr = new XMLHttpRequest();
  if ( ! "withCredentials" in xhr) {
    // Use proxy in ajax call
    //
  }
  else {
   // Standard CORS call
   // 
  }
于 2013-02-15T16:59:50.953 に答える
0

同一生成元ポリシーの制限を克服するには、次の3つの方法があります。

  1. CORS(クロスオリジンリソースシェアリング)-サービスプロバイダーのサーバー側で追加の構成が必要ですが、特にMongoLabsがこの方法をサポートしているため、開発者側で追加の作業を行う必要がないため、これは最も理想的なソリューションです。
  2. サーバー側プロキシ-リクエストを元のサーバーにルーティングするローカルサーバーを作成します。サーバーを構成するにはユーザー側での作業が必要ですが、同一生成元ポリシーの制限を完全に回避するのに役立ちます。
  3. JSONP(パディング付きのJavaスクリプトオブジェクト表記-このアプローチに関連するセキュリティリスクと、すべてのリクエストに対して1つのHTTP動詞(GET)に固執する必要があるという制限があるため、これは最後の手段になるはずです。
于 2013-10-06T22:02:46.310 に答える