개발관련/other

JSONP 란 무엇일까?

Rateye 2021. 11. 8. 15:52
728x90
반응형
질문 : 누구든지 일반 용어로 JSONP가 무엇인지 설명 할 수 있습니까?

JSONP 는 패딩이있는 JSON 것을 알고 있습니다.

jQuery.getJSON() 과 함께 사용하는 방법을 이해합니다. 그러나 JSONP를 도입 할 때 callback 개념을 이해하지 못합니다.

누구든지 이것이 어떻게 작동하는지 설명 할 수 있습니까?

답변

이 답변은 6 년이 넘었습니다. JSONP의 개념과 적용은 변경되지 않았지만 (즉, 답변의 세부 정보가 여전히 유효 함), 가능한 경우 CORS를 사용해야합니다 (즉, 서버 또는 API 가이를 지원하고 브라우저 지원 이 적절 함). 내재 된 보안 위험이 있습니다 .

JSONP ( JSON with Padding )는 웹 브라우저에서 교차 도메인 정책을 우회하는 데 일반적으로 사용되는 방법입니다. (브라우저에서 다른 서버에있는 것으로 인식되는 웹 페이지에 AJAX 요청을 할 수 없습니다.)

JSON과 JSONP는 클라이언트와 서버에서 다르게 작동합니다. XMLHTTPRequest 및 관련 브라우저 메서드를 사용하여 전달되지 않습니다. 대신 소스가 대상 URL로 설정된 <script> 그런 다음이 스크립트 태그가 DOM에 추가됩니다 (일반적으로 <head> 요소 내부).

JSON Request:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function () {
  if (xhr.readyState == 4 && xhr.status == 200) {
    // success
  };
};

xhr.open("GET", "somewhere.php", true);
xhr.send();

JSONP Request:

var tag = document.createElement("script");
        tag.src = 'somewhere_else.php?callback=foo';
        
        document.getElementsByTagName("head")[0].appendChild(tag);
        

JSON 응답과 JSONP 응답의 차이점은 JSONP 응답 개체가 콜백 함수에 인수로 전달된다는 것입니다.

JSON:

{ "bar": "baz" }
        

JSONP:

foo( { "bar": "baz" } );
        

callback 매개 변수가 포함 된 JSONP 요청이 표시되는 이유입니다. 따라서 서버는 응답을 래핑 할 함수의 이름을 알 수 있습니다.

이 함수는 브라우저에서 <script> 태그를 평가할 때 (요청이 완료된 후) 전역 범위 있어야합니다.


JSON 응답 처리와 JSONP 응답 사이에서 알아야 할 또 다른 차이점은 try / catch 문에서 responseText를 평가하려는 시도를 래핑하여 JSON 응답의 구문 분석 오류를 포착 할 수 있다는 것입니다. JSONP 응답의 특성으로 인해 응답의 구문 분석 오류로 인해 포착 할 수없는 JavaScript 구문 분석 오류가 발생합니다.

두 형식 모두 요청을 시작하기 전에 시간 초과를 설정하고 응답 핸들러에서 시간 초과를 지워 시간 초과 오류를 구현할 수 있습니다.


jQuery 사용

jQuery 를 사용하여 JSONP 요청을 할 때의 유용성은 jQuery가 백그라운드에서 모든 작업을 수행한다는 것입니다.

기본적으로 jQuery를 사용하려면 &callback=? AJAX 요청의 URL에서. jQuery는 success 함수를 가져 와서 고유 한 이름을 할당하고 전역 범위에 게시합니다. 그런 다음 물음표를 대체 ? &callback=? 할당 한 이름으로.


비교 JSON/JSONP 구현

다음은 응답 객체 { "bar" : "baz" }

JSON:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function () {
  if (xhr.readyState == 4 && xhr.status == 200) {
    document.getElementById("output").innerHTML = eval('(' + this.responseText + ')').bar;
  };
};

xhr.open("GET", "somewhere.php", true);
xhr.send();

JSONP:

function foo(response) {
  document.getElementById("output").innerHTML = response.bar;
};

var tag = document.createElement("script");
tag.src = 'somewhere_else.php?callback=foo';

document.getElementsByTagName("head")[0].appendChild(tag);
출처 : https://stackoverflow.com/questions/3839966/can-anyone-explain-what-jsonp-is-in-layman-terms
728x90
반응형