我读了很多关于'Access-Control-Allow-Origin'的错误,但我不明白我要解决的问题:(
我正在玩Google Moderator API,但当我尝试add new serie时,我收到了:
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 *”。我不知道如何在这里使用$ .getJSON,如果申请,因为我必须添加Authorization标头,我不知道怎么做没有来自$ .ajax的beforeCall:/
对于这个黑暗的任何光明u.u?
这就是代码:
<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 -->
答案 0 :(得分:232)
我解决了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
});
答案 1 :(得分:42)
我有完全相同的问题,它不是跨域,而是相同的域。我刚刚将这一行添加到处理ajax请求的php文件中。
<?php header('Access-Control-Allow-Origin: *'); ?>
它就像一个魅力。感谢海报
答案 2 :(得分:6)
是的,当jQuery看到URL属于不同的域时,它假定该调用是跨域调用,因此此处不需要crossdomain:true
。
另外,请注意,如果您的网址属于其他域(跨域)或您正在使用JSONP,则无法与$.ajax
进行同步通话。只允许异步调用。
注意:如果您根据请求指定async:false
,则可以同步调用服务。
答案 3 :(得分:6)
如果您尝试使用此服务器时出现此错误,则无法在该应用程序中添加标头Access-Control-Allow-Origin *
,但您可以在服务器前放置一个反向代理,可以避免错误标题重写。
假设应用程序在端口8080( www.mydomain.com 上的公共域)上运行,并且您将反向代理放在端口80的同一主机中,这是<的配置strong> 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 *;
}
}
答案 4 :(得分:1)
尝试我的代码 在JavaScript中
var settings = {
"url": "https://myinboxhub.co.in/example",
"method": "GET",
"timeout": 0,
"headers": {},
};
$.ajax(settings).done(function (response) {
console.log(response);
if (response.auth) {
console.log('on success');
}
}).fail(function (jqXHR, exception) {
var msg = '';
if (jqXHR.status === '(failed)net::ERR_INTERNET_DISCONNECTED') {
msg = 'Uncaught Error.\n' + jqXHR.responseText;
}
if (jqXHR.status === 0) {
msg = 'Not connect.\n Verify Network.';
} else if (jqXHR.status == 413) {
msg = 'Image size is too large.';
} else if (jqXHR.status == 404) {
msg = 'Requested page not found. [404]';
} else if (jqXHR.status == 405) {
msg = 'Image size is too large.';
} else if (jqXHR.status == 500) {
msg = 'Internal Server Error [500].';
} else if (exception === 'parsererror') {
msg = 'Requested JSON parse failed.';
} else if (exception === 'timeout') {
msg = 'Time out error.';
} else if (exception === 'abort') {
msg = 'Ajax request aborted.';
} else {
msg = 'Uncaught Error.\n' + jqXHR.responseText;
}
console.log(msg);
});;
在PHP
header('Content-type: application/json');
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET");
header("Access-Control-Allow-Methods: GET, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding");
答案 5 :(得分:0)
在我的情况下,子域名会导致问题。这是细节
我使用app_development.something.com
,这里下划线(_
)子域正在创建CORS错误。将app_development
更改为app-development
后,工作正常。
答案 6 :(得分:0)
php有一点小技巧。它不仅适用于Google,而且适用于您无法控制且无法添加Access-Control-Allow-Origin *
的任何网站我们需要在我们的网络服务器上创建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': 'https://stackoverflow.com/questions/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');
}
});
工作方式:
我们可以在onClick上创建事件,将该事件放在某个按钮上。 希望这会有所帮助!