JSONP와 함께 .ajax ()를 사용하는 기본 예?


187

JSONP를 시작하는 방법을 알려주는 사람이 있습니까?

암호:

$('document').ready(function() {
    var pm_url = 'http://twitter.com/status';
    pm_url += '/user_timeline/stephenfry.json';
    pm_url += '?count=10&callback=photos';
    var photos = function (data) {
     alert(data);
    };
    $.ajax({
        url: pm_url,
        dataType: 'jsonp',
        jsonpCallback: 'photos',
        jsonp: false,
    });
});

피들 : http://jsfiddle.net/R7EPt/6/

문서에서 해결할 수있는 한 경고를 생성해야합니다.

감사.


$ .ajax ({url : pm_url, dataType : 'jsonp', jsonpCallback : 사진, jsonp : 거짓,}); 사진을 문자열로 입력했습니다.
10

답변:


388

JSONPXMLHttpRequest 와 동일한 도메인 정책 을 극복하기위한 간단한 방법입니다 . (알다시피 AJAX (XMLHttpRequest) 요청을 다른 도메인으로 보낼 수는 없습니다 .)

따라서 XMLHttpRequest 를 사용하는 대신 JS가 다른 도메인에서 데이터를 가져 오려면 일반적으로 JS 파일을로드하는 데 사용하는 스크립트 HTMLl 태그 를 사용해야 합니다. 이상한데?

것입니다 - 밝혀 스크립트 태그와 유사한 방식으로 사용할 수있는 XMLHttpRequest를 ! 이것 좀 봐:

script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://www.someWebApiServer.com/some-data";

당신은 끝낼 것이다 스크립트 그 후 같은 외모가 데이터를로드하도록 세그먼트 :

<script>
{['some string 1', 'some data', 'whatever data']}
</script>

그러나 이것은 스크립트 태그 에서이 배열을 가져와야하기 때문에 약간 불편 합니다. 따라서 JSONP 제작자는 이것이 더 잘 작동한다고 결정했습니다.

script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://www.someWebApiServer.com/some-data?callback=my_callback";

공지 사항 my_callback의 저기 기능? 따라서 JSONP 서버가 요청을 받고 콜백 매개 변수를 찾으면 일반 JS 배열을 반환하는 대신 다음을 반환합니다.

my_callback({['some string 1', 'some data', 'whatever data']});

이익이 어디 있는지 확인하십시오. 이제 데이터를 가져 오면 자동 콜백 ( my_callback )이 실행됩니다. JSONP 에 대해 알아야 할 것은 콜백 및 스크립트 태그입니다.


참고 :
이들은 JSONP 사용법의 간단한 예이며 프로덕션 준비 스크립트가 아닙니다.

RAW JavaScript 데모 (JSONP를 사용한 간단한 Twitter 피드) :

<html>
    <head>
    </head>
    <body>
        <div id = 'twitterFeed'></div>
        <script>
        function myCallback(dataWeGotViaJsonp){
            var text = '';
            var len = dataWeGotViaJsonp.length;
            for(var i=0;i<len;i++){
                twitterEntry = dataWeGotViaJsonp[i];
                text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
            }
            document.getElementById('twitterFeed').innerHTML = text;
        }
        </script>
        <script type="text/javascript" src="http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=myCallback"></script>
    </body>
</html>


기본 jQuery 예 (JSONP를 사용한 간단한 Twitter 피드) :

<html>
    <head>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
        <script>
            $(document).ready(function(){
                $.ajax({
                    url: 'http://twitter.com/status/user_timeline/padraicb.json?count=10',
                    dataType: 'jsonp',
                    success: function(dataWeGotViaJsonp){
                        var text = '';
                        var len = dataWeGotViaJsonp.length;
                        for(var i=0;i<len;i++){
                            twitterEntry = dataWeGotViaJsonp[i];
                            text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
                        }
                        $('#twitterFeed').html(text);
                    }
                });
            })
        </script>
    </head>
    <body>
        <div id = 'twitterFeed'></div>
    </body>
</html>


JSONPJSON with Padding을 나타냅니다 . (대부분의 사람들이“패딩”이라고 생각하는 것과는 아무 관련이 없기 때문에 이름이 매우 낮은 기술입니다.)


3
브라우저는 이제 Access-Control-Allow-Origin일부 교차 출처 도메인에 대한 일반 Ajax 호출을 허용 하는 헤더를 지원하기 때문에이 답변은 다소 구식입니다 .
jfriend00

JSONP를 사용하여 양식 POST를 수행 할 수 없습니다. 더 많은 정보는 여기에 : markhneedham.com/blog/2009/08/27/…
thdoan

4
이러한 스크립트를 프로덕션 용으로 만들려면 무엇을 고려해야합니까?
손님

1
와, 정말 도움이됩니다! 마침내 JSONP가 정확히 무엇이고 어떻게 작동하는지 알게되었습니다!
Jerry Liu

146

jQuery를 사용하여 JSONP로 작업하는 더 쉬운 방법이 있습니다

$.getJSON("http://example.com/something.json?callback=?", function(result){
   //response data are now in the result variable
   alert(result);
});

?URL의 끝에이 대신 JSON의 JSONP 요청임을 jQuery를 알려줍니다. jQuery는 콜백 함수를 자동으로 등록하고 호출합니다.

자세한 내용은 jQuery.getJSON 문서를 참조하십시오 .


2
@ PetrPeller, 훌륭해 보이지만 제품을 만들어내는 것 같지 않습니다. 이걸 한번 볼 수 있습니까? JSFiddle 데이터를 경고하지 않습니다. 어쩌면 내가 뭔가를 놓친
tika

@xDNP JSONP 응답은 서버에서 지원해야합니다. mylivecanvas.com/api/…에서 추가 콜백을 볼 수 없으므로 서버가 지원하지 않는 것 같습니다 . 또한 &callback=?귀하의 경우 첫 번째 매개 변수가 아니므로 사용해야합니다 .
Petr Peller

1
@PetrPeller 귀하의 솔루션에 크게 관심이 있습니다. 그러나 그것은 나에게 효과가 없습니다. 새 질문을 게시하고 싶지 않지만 도움이되지 않습니다. 서버에서 지원하지 않는 것은 무엇을 의미합니까? 어떻게해야합니까? 그리고 내 서버에서 작동하는 완전한 URL을 제공 할 수 있습니까? 나는 당신에게 감사합니다. 서버 구성이 필요합니까?
tika

3
"JQuery를 더 이상 사용하지 마십시오!" 평균?
ParkCheolu

1
이제 2018 년이며 2017 년에 무엇을 사용 해야할지 확실하지 않습니다!
Vasily Hall

28

OP에 대한 응답으로 코드에 두 가지 문제가 있습니다. jsonp = 'callback'을 설정해야하며, 변수에 콜백 함수를 추가해도 작동하지 않는 것 같습니다.

업데이트 : 이것을 작성했을 때 Twitter API가 방금 열려 있었지만 변경되었으므로 이제 인증이 필요합니다. 두 번째 예제를 실제 (2014Q1) 예제로 변경했지만 이제는 github을 사용합니다.

이것은 더 이상 작동하지 않습니다. 연습으로 Github API로 바꿀 수 있는지 확인하십시오.

$('document').ready(function() {
    var pm_url = 'http://twitter.com/status';
    pm_url += '/user_timeline/stephenfry.json';
    pm_url += '?count=10&callback=photos';
    $.ajax({
        url: pm_url,
        dataType: 'jsonp',
        jsonpCallback: 'photos',
        jsonp: 'callback',
    });
});
function photos (data) {
    alert(data);
    console.log(data);
};

그런 배열을 alert ()하는 것이 실제로 제대로 작동하지 않지만 Firebug의 "Net"탭에 JSON이 올바르게 표시됩니다. 또 다른 편리한 트릭은

alert(JSON.stringify(data));

jQuery.getJSON 메소드를 사용할 수도 있습니다 . 다음은 github에서 "gists"목록을 가져 오는 완전한 html 예제입니다. 이렇게하면 무작위로 명명 된 콜백 함수가 만들어집니다. 이것이 최종 "콜백 =?"입니다. URL에서.

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>JQuery (cross-domain) JSONP Twitter example</title>
        <script type="text/javascript"src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
        <script>
            $(document).ready(function(){
                $.getJSON('https://api.github.com/gists?callback=?', function(response){
                    $.each(response.data, function(i, gist){
                        $('#gists').append('<li>' + gist.user.login + " (<a href='" + gist.html_url + "'>" + 
                            (gist.description == "" ? "undescribed" : gist.description) + '</a>)</li>');
                    });
                });
            });
        </script>
    </head>
    <body>
        <ul id="gists"></ul>
    </body>
</html>

2
당신 말이 맞아, 더 이상 작동하지 않습니다. 트위터는 그들의 API를 변경했습니다.
PapaFreud

3
<!DOCTYPE html>
<html>
<head>
<style>img{ height: 100px; float: left; }</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<title>An JSONP example </title>
</head>
<body>
<!-- DIV FOR SHOWING IMAGES -->
<div id="images">
</div>
<!-- SCRIPT FOR GETTING IMAGES FROM FLICKER.COM USING JSONP -->
<script>
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?",
{
  format: "json"
},
//RETURNED RESPONSE DATA IS LOOPED AND ONLY IMAGE IS APPENDED TO IMAGE DIV
function(data) {
  $.each(data.items, function(i,item){
  $("<img/>").attr("src", item.media.m).appendTo("#images");

 });
});</script>
</body>
</html> 

위 코드는 Flicker API에서 이미지를 가져 오는 데 도움이됩니다. JSONP를 사용하여 이미지를 가져 오기 위해 GET 메소드를 사용합니다. 여기 에서 자세히 볼 수 있습니다

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