jQuery投稿をGoogle APIに送信する際のAccess-Control-Allow-Originエラー


143

「Access-Control-Allow-Origin」エラーについてたくさん読みましたが、何を修正する必要があるのか​​わかりません:(

私はGoogleモデレーターAPIで遊んでいますが、新しいセリエ追加しようとすると、次のメッセージが表示されます。

XMLHttpRequest cannot load 
https://www.googleapis.com/moderator/v1/series?key=[key]
&data%5Bdescription%5D=Share+and+rank+tips+for+eating+healthily+on+the+cheaps!
&data%5Bname%5D=Eating+Healthy+%26+Cheap
&data%5BvideoSubmissionAllowed%5D=false. 
Origin [my_domain] is not allowed by Access-Control-Allow-Origin.

コールバックパラメーターの有無にかかわらず、ヘッダーに「Access-Control-Allow-Origin *」を追加しようとしました。そして、私はAuthorizationヘッダーを追加する必要があり、$。ajaxからのbeforeCallなしでそれを行う方法がわからないため、ここで$ .getJSONを使用する方法がわかりません。

この暗闇のための光uu?

それがコードです:

<script src="http://www.google.com/jsapi"></script>

<script type="text/javascript">

var scope = "https://www.googleapis.com/auth/moderator";
var token = '';

function create(){
     if (token == '')
      token = doCheck();

     var myData = {
      "data": {
        "description": "Share and rank tips for eating healthily on the cheaps!", 
        "name": "Eating Healthy & Cheap", 
        "videoSubmissionAllowed": false
      }
    };

    $.ajax({

        url: 'https://www.googleapis.com/moderator/v1/series?key='+key,
        type: 'POST',
        callback: '?',
        data: myData,
        datatype: 'application/json',
        success: function() { alert("Success"); },
        error: function() { alert('Failed!'); },
        beforeSend: setHeader

    });
}

function setHeader(xhr) {

  xhr.setRequestHeader('Authorization', token);
}

function doLogin(){ 
    if (token == ''){
       token = google.accounts.user.login(scope);
    }else{
       alert('already logged');
    }
}


function doCheck(){             
    token = google.accounts.user.checkLogin(scope);
    return token;
}
</script>
...
...
<div data-role="content">
    <input type="button" value="Login" onclick="doLogin();">
    <input type="button" value="Get data" onclick="getModerator();">
    <input type="button" value="Create" onclick="create();">
</div><!-- /content -->

1
あなたのコードをもう少し完全に入れてもらえますか?コードを実行できませんでした。
Hosein Aqajani

回答:


249

Access-Control-Allow-Originエラーを解決し、dataTypeパラメーターをdataType: 'jsonp'に変更して、crossDomain:trueを追加しました

$.ajax({

    url: 'https://www.googleapis.com/moderator/v1/series?key='+key,
    data: myData,
    type: 'GET',
    crossDomain: true,
    dataType: 'jsonp',
    success: function() { alert("Success"); },
    error: function() { alert('Failed!'); },
    beforeSend: setHeader
});

20
crossDomain:true必須ではないと思います。私の理解では、独自のドメインでリクエストを作成しているが、jQueryでそれをクロスドメインリクエストのように扱いたい場合にのみ必要であると理解しています。
Alex W

7
crossDomain必要ありません。これは、jsonpドメイン間の通信を目的とした通常の要求です。
hitautodestruct

50
同じエラーが出ますが、リクエストを投稿したいと思います。jsonpはPOSTをサポートしません。どうすればこれを解決できますか?
iamjustcoder 2013年

7
また、メソッドをPOSTからGETに変更しました
Dave Baghdanov '18

5
@rubdottocom URLがjsonの代わりにXML応答を返した場合...?
Developer Desk

43

私はまったく同じ問題を抱えており、それはクロスドメインではなく同じドメインでした。私はこの行をajaxリクエストを処理していたphpファイルに追加しました。

<?php header('Access-Control-Allow-Origin: *'); ?>

それは魅力のように働きました。ポスターのおかげで


29
これは非常に危険です。誰かがあなたのページにjavascriptを挿入できた場合、ユーザーが提供する可能性のあるあらゆる情報を簡単に「電話ホーム」にできます。
dclowd9901 2014年

@ dclowd9901:"Unsafe"は、Access-Control-Allow-Originヘッダー匿名に設定するために観察された使用目的と対策に応じて相対的です。
nyedidikeke 2017

6

Access-Control-Allow-Origin *アプリケーションでヘッダーを追加できないサービスを利用しようとしてこのエラーが発生したが、サーバーの前にリバースプロキシを配置できる場合は、ヘッダーを書き換えることでエラーを回避できます。

アプリケーションがポート8080(www.mydomain.comのパブリックドメイン)で実行されていて、リバースプロキシを同じホストのポート80に配置すると仮定すると、これはNginxリバースプロキシの構成です。

server {
    listen      80;
    server_name www.mydomain.com;
    access_log  /var/log/nginx/www.mydomain.com.access.log;
    error_log   /var/log/nginx/www.mydomain.com.error.log;

    location / {
        proxy_pass   http://127.0.0.1:8080;
        add_header   Access-Control-Allow-Origin *;
    }   
}

2
上記のように、「*」を使用することは非常に危険です。
Adaddinsane

5
はい。ただし、何を公開するかによって異なります。承認なしにパブリックAPIを公開する場合は、それが方法です(私の場合)。そうでない場合は、次のようなsomethigを使用する必要がありますAccess-Control-Allow-Origin: http://example.com
マリアーノルイス

2
postmanとajaxを介してAPIをテストするとき。しかし郵便配達の要求は成功です。しかし、ajaxではfalseを返します。
Araf、

@Araf postmanおよびその他のアプリケーションは、ブラウザーに組み込まれているCORS保護をトリガーしません。
SenseiHitokiri

6

はい、jQueryがURLが別のドメインに属していることを確認した瞬間、その呼び出しはクロスドメイン呼び出しであると想定します。 crossdomain:trueでは必要ありません。

また、次を使用して同期呼び出しを行うことはできません。 $.ajax URLが別のドメイン(クロスドメイン)に属している場合、またはJSONPを使用している場合は、を使用し。非同期呼び出しのみが許可されます。

注:async:falseリクエストでを指定すると、サービスを同期的に呼び出すことができます。


0

私の場合、サブドメイン名が問題の原因です。詳細はこちら

私が使用したapp_development.something.com、ここではアンダースコア(_)サブドメインがCORSエラーを作成しています。変更した後app_developmentapp-developmentそれがうまく動作します。


0

phpで少しハックがあります。そして、それはGoogleだけでなく、あなたが制御しておらず、Access-Control-Allow-Originを追加できないWebサイトでも機能します*

Webサーバー上にPHPファイル(例:getContentFromUrl.php)を作成し、ちょっとしたトリックを作成する必要があります。

PHP

<?php

$ext_url = $_POST['ext_url'];

echo file_get_contents($ext_url);

?>

JS

$.ajax({
    method: 'POST',
    url: 'getContentFromUrl.php', // link to your PHP file
    data: {
        // url where our server will send request which can't be done by AJAX
        'ext_url': '/programming/6114436/access-control-allow-origin-error-sending-a-jquery-post-to-google-apis'
    },
    success: function(data) {
        // we can find any data on external url, cause we've got all page
        var $h1 = $(data).find('h1').html();

        $('h1').val($h1);
    },
    error:function() {
        console.log('Error');
    }
});

使い方:

  1. JSの助けを借りてあなたのブラウザはあなたのサーバーにリクエストを送信します
  2. サーバーは他のサーバーにリクエストを送信し、別のサーバー(任意のWebサイト)から応答を取得します
  3. サーバーはこの返信をJSに送信します

そして、イベントをonClickにして、このイベントをいくつかのボタンに配置できます。これが役立つことを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.