JavaScript와 JSONP를 사용한 도메인 간 데이터 요청 예시에 대한 자세한 설명

高洛峰
풀어 주다: 2017-01-09 10:46:06
원래의
1394명이 탐색했습니다.

머리말

최근 업무상 iCiba의 일상 문장을 페이지에 소개해야 합니다. iCiba는 API를 외부에 공개했고, 인터페이스는 json 데이터를 반환합니다. 페이지가 가벼워서 jQuery를 사용하지 않고 순수 js로 직접 코드 조각을 작성했습니다.

<script type="text/javascript">
 function httpGetAsync(theUrl, callback)
 {
 xmlHttp = null;
 if (window.XMLHttpRequest)
 {// code for IE7, Firefox, Opera, etc.
 xmlHttp = new XMLHttpRequest();
 }
 else if (window.ActiveXObject)
 {// code for IE6, IE5
 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 }
 if (xmlHttp != null)
 {
 xmlHttp.onreadystatechange = function() {
 if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
 {
  callback(xmlHttp.responseText);
 }
 else
 {
  console.error("Problem retrieving XML data");
 }
 }
 xmlHttp.open("GET", theUrl, true); // true for asynchronous
 xmlHttp.setRequestHeader(&#39;Access-Control-Allow-Origin&#39;, &#39;*&#39;);
 xmlHttp.send(null);
 }
 else
 {
 console.error("Your browser does not support XMLHTTP.");
 }
 }
 
 function showIcibaDS(ds_data)
 {
 // show daily sentence
 content = ds_data.content;
 note = ds_data.note;
 document.write(content + &#39;<br>&#39;);
 document.write(note);
 }
 
 httpGetAsync("http://open.iciba.com/dsapi/", showIcibaDS);
</script>
로그인 후 복사

실행 후 데이터를 얻지 못했습니다. 그런데 다음과 같은 오류 메시지가 나타났습니다.

XMLHttpRequest cannot load http://open.iciba.com/dsapi/. Response to preflight request doesn&#39;t pass access control check: No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource. Origin &#39;null&#39; is therefore not allowed access. The response had HTTP status code 501.
로그인 후 복사

이것은 도메인 간 요청 문제입니다. 그렇다면 교차 도메인 요청이란 무엇입니까? 보안상의 이유로 브라우저는 동일한 도메인의 인터페이스와의 상호 작용만 허용하는 동일 출처 정책을 채택합니다.

동일한 도메인은 다음을 의미합니다.

동일한 프로토콜: http 또는 https 등

동일한 도메인 이름: http://konghy.cn/a 또는 http: / /konghy.cn/b

동일 포트: 둘 다 80포트인 경우

즉, 사용자가 현재 페이지 아래 http://blog.konghy.cn 페이지를 열었습니다. Node.js는 브라우저에서 허용하는 http://blog.konghy.cn/XXX 인터페이스에 데이터 요청을 보냅니다. 그러나 http://open.iciba.com/xxx로 데이터 요청을 보내면 도메인 간 호출이 있기 때문에 브라우저에 의해 차단됩니다.

교차 도메인 요청에 대한 솔루션은 JSONP(JSON with Padding)입니다. HTML의 스크립트 태그는 다른 도메인의 js를 로드할 수 있습니다. JSONP는 스크립트 태그를 사용하여 데이터를 가져와서 JS로 실행합니다. 그런 다음 콜백 함수를 사용하여 데이터를 추출합니다.

<script type="text/javascript">
 var cur_date = new Date();
 document.getElementById("cur_year").innerHTML = cur_date.getFullYear();
 
 function showIcibaDS(ds_data)
 {
 // show daily sentence
 content = ds_data.content;
 note = ds_data.note;
 ds_p = document.getElementById("iciba_ds")
 var content_span = document.createElement(&#39;span&#39;);
 var note_span = document.createElement(&#39;span&#39;);
 var br = document.createElement(&#39;br&#39;)
 content_span.innerHTML = content
 note_span.innerHTML = note
 ds_p.appendChild(content_span);
 ds_p.appendChild(br);
 ds_p.appendChild(note_span);
 }
</script>
<script type="text/javascript" src="http://open.iciba.com/dsapi/?callback=showIcibaDS"></script>
로그인 후 복사

그런 다음 정보를 확인하고 누군가 이를 캡슐화했는지 확인합니다.

function jsonp(setting)
{
 setting.data = setting.data || {}
 setting.key = setting.key||&#39;callback&#39;
 setting.callback = setting.callback||function(){}
 setting.data[setting.key] = &#39;__onGetData__&#39;
 
 window.__onGetData__ = function(data) {
 setting.callback (data);
 }
 var script = document.createElement(&#39;script&#39;)
 var query = []
 for(var key in setting.data)
 {
 query.push(key + &#39;=&#39; + encodeURIComponent(setting.data[key]))
 }
 script.src = setting.url + &#39;?&#39; + query.join(&#39;&&#39;)
 document.head.appendChild(script)
 document.head.removeChild(script)
}
 
jsonp({
 url: &#39;http://photo.sina.cn/aj/index&#39;,
 key: &#39;jsoncallback&#39;,
 data: { page: 1, cate: &#39;recommend&#39; },
 callback: function(ret) {
 console.log(ret)
 }
})
로그인 후 복사

jQuery를 사용하는 경우 Ajax를 직접 사용하여 데이터를 요청할 수 있습니다.

<script src="js/jquery-1.11.3.js"></script>
<script>
$(function(){
 $.ajax({
 async: true,
 type: "GET",
 dataType: &#39;jsonp&#39;,
 jsonp: &#39;callback&#39;,
 jsonpCallback: &#39;callbackfunction&#39;,
 url: "http://open.iciba.com/dsapi/",
 data: "",
 timeout: 3000,
 contentType: "application/json;utf-8",
 success: function(data) {
 console.log(data);
 }
 });
})
</script>
로그인 후 복사

요약

이상은 이 글의 전체 내용입니다. 모든 분들의 공부나 업무에 조금이나마 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시면 메시지를 남겨주세요.

JSONP를 사용하여 도메인 간 데이터를 요청하는 JavaScript의 자세한 예를 보려면 PHP 중국어 웹사이트에서 관련 기사를 주목하세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!