jQuery Post를 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 *'를 헤더에 추가하려고했습니다. 승인 헤더를 추가해야하기 때문에 $ .getJSON을 사용하는 방법을 모르겠습니다.

이 어둠에 대한 빛이 있습니까?

이것이 코드입니다.

<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

dataType 매개 변수를 dataType : 'jsonp' 로 수정하고 crossDomain : true를 추가하는 Access-Control-Allow-Origin 오류를 해결했습니다 .

$.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

7
또한 GET에 POST에서 방법을 변경
데이브 Baghdanov을

5
URL이 json 대신 xml 응답을 반환하면 어떻게됩니까?
개발자 데스크

43

나는 정확히 같은 문제가 있었고 도메인 간이 아니라 동일한 도메인이었습니다. 방금이 줄을 ajax 요청을 처리하는 php 파일에 추가했습니다.

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

그것은 매력처럼 작동했습니다. 포스터 덕분에


29
이것은 매우 안전하지 않습니다. 다른 사람이 귀하의 페이지에 자바 스크립트를 삽입하면 사용자가 제공 할 수있는 정보를 쉽게 "집에 전화"할 수 있습니다.
dclowd9901

@ dclowd9901 : "안전하지 않은" 은 사용 목적 및 Access-Control-Allow-Origin 헤더익명으로 설정하기 위해 관찰 된 조치에 따라 상대적 입니다.
nyedidikeke

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합니다.
Mariano Ruiz

2
우편 배달부와 아약스를 통해 API를 테스트 할 때. 그러나 우편 배달부 요청은 성공입니다. 그러나 아약스는 거짓을 반환합니다.
Araf

@Araf 우체부 및 기타 응용 프로그램은 브라우저에 내장 된 CORS 보호를 트리거하지 않습니다.
SenseiHitokiri

6

예, jQuery가 URL이 다른 도메인에 속하는 것을 본 순간,이 호출은 도메인 간 호출로 가정하므로 crossdomain:true여기서는 필요하지 않습니다.

또한 $.ajaxURL이 다른 도메인 (크로스 도메인)에 속하거나 JSONP를 사용중인 경우 동기식 호출을 수행 할 수 없습니다 . 비동기 호출 만 허용됩니다.

참고 : async:false요청과 함께 를 지정하면 서비스를 동 기적으로 호출 할 수 있습니다 .


0

필자의 경우 하위 도메인 이름으로 인해 문제가 발생합니다. 자세한 내용은 다음과 같습니다

내가 사용 app_development.something.com여기에 밑줄 (, _) 서브 도메인이 CORS 오류를 만드는 것입니다. 변경 한 후에 app_developmentapp-development그것을 잘 작동합니다.


0

PHP에는 약간의 해킹이 있습니다. 또한 Google뿐만 아니라 귀하가 제어하거나 액세스 제어-허용-오리진을 추가 할 수없는 모든 웹 사이트에서 작동합니다 *

웹 서버에서 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. 서버는 다른 서버로 요청을 보내고 다른 서버 (모든 웹 사이트)에서 응답을받습니다.
  3. 귀하의 서버는이 회신을 JS로 보냅니다.

그리고 우리는 onClick 이벤트를 만들 수 있습니다. 이것이 도움이되기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.