将jQuery Post发送到Google API的Access-Control-Allow-Origin错误

rub*_*com 137 ajax jquery jsonp google-api cors

我读了很多关于'Access-Control-Allow-Origin'的错误,但我不明白我要解决的问题:(

我正在玩Google Moderator 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.
Run Code Online (Sandbox Code Playgroud)

我尝试使用和不使用回调参数,我尝试在标题中添加"Access-Control-Allow-Origin*".我不知道如何在这里使用$ .getJSON,如果申请,因为我必须添加Authorization标头,我不知道怎么做没有来自$ .ajax的beforeCall:/

这个黑暗的任何光明吗?

那是代码:

<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 -->
Run Code Online (Sandbox Code Playgroud)

rub*_*com 242

我解决了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
});
Run Code Online (Sandbox Code Playgroud)

  • 我收到同样的错误,但我想发布请求.jsonp不支持POST.我怎么解决这个问题? (49认同)
  • 我不认为`crossDomain:true`是必需的.我的理解是,只有当你在自己的域上发出请求但希望jQuery将其视为跨域请求时才有必要. (20认同)
  • 不需要`crossDomain`.这是一个常规的`jsonp`请求,用于跨域通信. (7认同)
  • 您还将方法从POST更改为GET (6认同)
  • @rubdottocom如果url返回xml响应而不是json ... (5认同)
  • 切换到jsonp并不是万灵药.你不能这样做POST,也不会用XHR调度. (4认同)
  • 这不再有效,真的很令人沮丧。仍然返回“跨源读取阻止 (CORB) 阻止跨源响应” (3认同)

Muh*_*eer 44

我有完全相同的问题,它不是跨域而是相同的域.我刚刚将这一行添加到处理ajax请求的php文件中.

<?php header('Access-Control-Allow-Origin: *'); ?>
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.感谢海报

  • 这是非常不安全的.如果有人设法将javascript注入您的页面,他们可以轻松地"回拨"用户可能提供的任何信息. (27认同)

小智 6

是的,当jQuery看到URL属于不同的域时,它假定该呼叫是跨域调用,因此crossdomain:true这里不需要.

另外,请注意,$.ajax如果您的URL属于不同的域(跨域)或您使用的是JSONP ,则无法进行同步调用.只允许异步调用.

注意:如果您指定了async:false您的请求,则可以同步调用服务.


Mar*_*uiz 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 *;
    }   
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但取决于你暴露的是什么.如果您未经授权发布公共API,那就是这种方式(我的情况).如果不这样做,你应该像这样使用somethig:`Access-Control-Allow-Origin:http:// example.com`. (5认同)
  • 如上所述使用'*'是非常不安全的. (2认同)
  • 当我通过邮递员和ajax测试api时。但是邮递员的要求是成功的。但是在ajax中返回false。 (2认同)