2011-04-05 4 views
11

로컬 네트워크에서 다음 jquery 코드를 실행 해 봅니다.JSON : 도메인 간 JSON 호출을 수행하려면 어떻게합니까

$.ajax({ 
    type: "GET", 
    url: "http://SomeSite/MyUrl/", 
    cache: false, 
    data: { ... }, 
    dataType: "json", 

    error: function (xhr, status, error) { 
            ... 
    }, 
    success: function (json) { 
            ... 
    }); 

"SomeSite"가 localhost 일 때까지 모든 것이 올바르게 작동합니다. 나는 페이지가 다운로드 된 것과 동일한 서버를 의미합니다.

그러나 'SomeSite'가 다른 (로컬 호스트가 아닌) 네트워크 사이트 인 경우 요청이 중단 된 것처럼 보입니다. "오류"도 아니며 "성공"콜백 함수도 호출되지 않습니다. 이 코드를 어떻게 작동시킬 수 있습니까?

미리 감사드립니다. 당신은 요청 http://api.jquery.com/jQuery.ajax/를 JSONP 시도 할 수

+0

테스트 한 브라우저는 무엇입니까? –

답변

1

cross domain jquery ajax request에서 참조하시기 바랍니다 교차 도메인을 참조하십시오. 원격 서버가 JSONP를 지원한다면 콜백을 사용할 수 있다고 생각합니다.

1

실제로 GET을 호출 할 수 있습니다.
크로스 사이트 스크립팅을 통해 POST, PUT, DELETE 또는 PATCH를 호출 할 수있는 확실한 방법은 없습니다.
실용적인 방법은 손으로 쓴 프록시입니다.

1

동일한 원본 정책으로 인해이 작업을 수행 할 수 없습니다. 한 가지 해결 방법은 동일한 출처 정책을 무시하기 위해 Flash 무비를 사용하는 Flash AJAX jQuery 플러그인 http://flxhr.flensed.com/을 사용하는 것입니다.

다른 옵션은 사용자의 도메인을 통해 요청을 프록시하거나 JSONP를 사용하는 것입니다.

16

같은 문제가있었습니다. 서버에서 json을 얻으려고하면 액세스 할 수 없게됩니다 (=> JSONP 없음).

찾았습니다 http://benalman.com/projects/php-simple-proxy/ 서버에 php 프록시를 추가하고이 파일에 대한 ajax 호출을 수행하십시오.
"원격 URL 리소스로 전달되는 모든 GET 매개 변수는이 매개 변수에서 urlencoded되어야합니다."
http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

+0

대안은 매력처럼 작동했습니다. 감사! 그러나 프록시 PHP는 항상 실패했다. 정의되지 않은 선택적 매개 변수에 대한 PHP주의 사항과 json의 내용 변수는 항상 null이었다. – user2718671

7
: proxy.php이 (벤 독일어에서 파일) (나는 차선의 방책이에 수 있음) 도메인



대안에서 호스팅되는

$.ajax({ 
    type: 'GET', 
    url:'proxy.php?url=http://anyDomain.com?someid=thispage', 
    dataType: "json", 
    success: function(data){ 
     // success_fn(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // error_fn(jqXHR, textStatus, errorThrown); 
    } 
}); 

'SomeSite'에 대한 서버 액세스 권한이 있습니까? 아니면 타사입니까?

  • 당신이 그것을에 CORSwp, home을 활성화 할 수 있습니다 당신이 액세스 할 수있는 경우. 가장 간단한 형태로, 단지 헤더 추가 (데이터 세션 구분하지 않습니다) : Access-Control-Allow-Origin: *

  • 당신이 당신이 JSONPwp, so을 지원하는지 여부를 알 수 있습니까 액세스 할 수없는 경우? 일반적으로 URL에 callback 매개 변수를 전달해야합니다. (물론 액세스 할 수 있다면 JSONP도 지원할 수 있습니다.)

  • 당신이 'SomeSite'을 변경할 권한이 없습니다하고도 CORSJSONP 지원하는 경우, 당신은 프록시로 YQLwp, home을 사용할 수 있습니다. CORSJSONP을 모두 지원하며 데이터 형식을 변환하거나 일부 데이터를 선택할 수도 있습니다.
    (YQL은 robots.txt을 존중하므로 자동 액세스를 제한하는 타사 사이트 인 경우 여전히 운이 좋지 않을 수 있습니다.)

+0

hmoe 및 wp에서 각 링크가 수행해야 할 다른 웹 사이트로 연결되는 링크는 무엇입니까? – AaA

+0

"wp"= 위키 백과 페이지. "집"은 그 사람의 홈페이지입니다. – hippietrail

+0

두 번째 홈 링크는 내가 가정 한 가사로 YouTube 비디오에 있습니다. – AaA

1

당신이 자원을로드 할 서버에 액세스 할 수있는 경우/당신은 서버 응답의 요청 헤더를 수정할 수있는 데이터가

"액세스 제어 - 허용 - 원산지"를 포함하는, "*"

같은 Orig 브라우저가 적용하는 정책 - 브라우저에 따라 다양한 정도의 엄격함을 알고있는 한 - 부분적으로는 응답 헤더 값을 기반으로합니다.

webservice에서 json을로드 할 때 동일한 문제가 발생했습니다. 모든 JS 해킹은 내가 실제로 알아 내지 못했고, 나 자신이 통제하고 신뢰하는 서버에서 데이터를로드하고 싶다면 왜 이것을해야하는지 궁금해하고 있었다. 그런 다음 서버의 응답 헤더가이 모든 문제에서 중요한 역할을한다는 것을 알게되었습니다. 위에서 설명한 헤더를 웹 서비스의 http 응답에 추가하면 문제가 해결되었습니다.

+0

크롬을 --disable-web-security 플래그로 시작하여 SameOriginPolicy를 삭제할 수 있습니다. 이렇게하면 크롬의 네트워크 탭을 사용하여 응답에 포함 된 헤더를 확인할 수도 있습니다. 이것은 디버깅 할 때 많은 도움이되었습니다. – bennidi

1

비슷한 문제가 있습니다. 나는 Symba가 인용 한 프록시 스크립트를 시도했지만 어떤 이유로 내 컴퓨터에서 작동하지 않습니다. 제 경우에는 동일한 호스트의 JBoss AS에서 호스팅되는 응용 프로그램에 요청을 보내려고했습니다. 어떻게 든 JBoss 버전에는 응답 헤더를 수정하여 "Access-Control-Allow-Origin", "*"을 포함 할 수있는 방법이 없었습니다.

위의 Symba의 방법을 사용하여 해결했지만 Ben Alman의 스크립트 대신 아파치 서버에 역방향 프록시를 설정했습니다 (http://docs.oseems.com/general/application/apache/configure-reverse-proxy 참조). 기본적으로 Apache에는 도메인 간 문제가 있습니다. 응답 헤더 "Access-Control-Allow-Origin", "*"(http://enable-cors.org/server_apache.html 참조)을 설정하면 문제가 해결됩니다.