2014-07-09 6 views
2

다른 웹 사이트에서 json 데이터를 검색하여 간단한 crossdomain 요청을 시도했습니다. Wamp에서 index.php 파일을 실행했습니다 :교차 출처 요청이 차단되었습니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" manifest="manifest.appcache"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>MySite</title> 
<script type="text/javascript"> 
    function getXDomainRequest() { 
     var xdr = null; 

     if (window.XDomainRequest) { 
      xdr = new XDomainRequest(); 
     } else if (window.XMLHttpRequest) { 
      xdr = new XMLHttpRequest({mozSystem: true}); 
     } else { 
      alert("Your browser does not support AJAX"); 
     } 

     return xdr; 
    } 
    function sendData() { 
     var xdr = getXDomainRequest(); 
     xdr.onload = function() { 
      alert(xdr.responseText); 
     } 

     xdr.open("GET", "http://example.com"); 
     xdr.send(); 
    } 
</script> 
</head> 
<body> 
<p> 
     <input type="button" onclick="sendData();" value="Retrieve" /> 
</p> 
</body> 
</html> 

그러나 교차 출처 요청이 차단되었다는 오류가 표시됩니다. 나는 꽤 js에 익숙하지 않다. 그리고 js에서 웹 API를 사용하려고 시도한 것은 이번이 처음이다. 그래서 여기에 뭔가 빠뜨린 것 같다. ...

고마워.

+2

'XMLHttpRequest'는 도메인 간 요청에 대해 작동하지 않습니다. [JSONP] (http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about)를 참조하십시오. –

+0

그래,하지만 XDomainRequest가 맞습니까? 유감스럽게도 JSONP를 지원하지 않는 [Steam API] (https://developer.valvesoftware.com/wiki/Steam_Web_API#GetGlobalAchievementPercentagesForApp_.28v0001.29)에 쿼리하고 있습니다. – deKajoo

+4

브라우저를 사용하여이 요청을하지 마십시오. 그렇지 않으면 api 키를 누구든지 (누구든지?) 응용 프로그램을 사용하는 사람이 자유롭게 사용할 수 있습니다. –

답변

5

자바 스크립트 요청은 특정 상황에서만 교차 도메인이 될 수 있습니다. 다음은 몇 가지 기술과 해결 방법을 요약 한 것입니다.

  1. 소스에 JSONP가있는 경우 도메인 간 제한을 피할 수 있습니다. http://www.sitepoint.com/jsonp-examples/

  2. 원본이 원본 정책을 가지고 있으면 도메인 간 요청을 할 수있는 것보다 적습니다. 오류가 발생하는 것을보고 소스에이 정책이 있는지 의심 스럽습니다. 기억해 주시면 모든 브라우저에서 지원되지는 않습니다 ...

  3. 기억해 주시면 데이터를 전송할 수있는 iFrame 메소드 (해킹이라고도 함)가 있습니다. 기껏해야 최적이 아닙니다.

  4. 그렇지 않은 경우 PHP로 JSON 파일을 캐시하고 서버에 저장할 수 있습니다. 더 이상 교차 도메인이 아닙니다. 당신은 그들이 JSONP 사용할 수있는 가능성이 높다보다는, 공개 API에서 당겨을 시도하는 경우

자세한 내용은 Ways to circumvent the same-origin policy

에서 찾을 수 있습니다. 그렇지 않다면 매번 데이터를 가져 오지 않고 (대역폭 청구를 원하지 않는), PHP로 필요에 따라 캐시하는 것이 더 바람직 할 것입니다.

+0

고마워요, 내가 뭘 찾고 있었는지, 나는 약간의 PHP를 무서워하지만 JSONP가 작동하지 않을 것이고 내 API 키를 숨길 필요가 있기 때문에 거기에 아무런 방법이 없다고 생각합니다. – deKajoo

+0

@JonathanLonowski Fair. 내 말씨가 아마도 최고는 아니었다. 의견을 반영하도록 업데이트되었습니다. – Jason

+0

메소드 번호 4에 대한 유용한 자습서 또는 소스가 있습니까? – deKajoo