191 votes

Exemple de base de l'utilisation de .ajax() avec JSONP ?

Quelqu'un pourrait-il m'aider à trouver comment démarrer avec JSONP ?

Código:

$('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,
    });
});

Violon : http://jsfiddle.net/R7EPt/6/

Devrait produire une alerte, d'après ce que je peux trouver dans la documentation : ne l'est pas (mais ne produit pas d'erreurs non plus).

Merci.

0 votes

$.ajax({ url : pm_url, dataType : 'jsonp', jsonpCallback : photos, jsonp : false, }) ; Vous aviez saisi les photos sous forme de chaîne.

394voto

ThatGuy Points 6454

JSONP est vraiment une astuce simple pour surmonter XMLHttpRequest même politique de domaine. (Comme vous le savez, on ne peut pas envoyer AJAX (XMLHttpRequest) demande vers un domaine différent).

Ainsi, au lieu d'utiliser XMLHttpRequest nous devons utiliser script Les balises HTMLl, celles que vous utilisez habituellement pour charger des fichiers JS, afin que JS obtienne des données d'un autre domaine. Cela vous paraît bizarre ?

Le fait est que - il s'avère que script peuvent être utilisées de manière similaire à XMLHttpRequest ! Regarde ça :

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

Vous vous retrouverez avec un script qui ressemble à ceci après avoir chargé les données :

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

Cependant, c'est un peu gênant, car nous devons récupérer ce tableau à partir de script étiquette. Donc JSONP Les créateurs ont décidé que cela fonctionnerait mieux (et c'est le cas) :

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

Avis mon_callback fonction là-bas ? Alors - quand JSONP Le serveur reçoit votre demande et trouve le paramètre de rappel - au lieu de retourner un simple tableau JS, il retournera ceci :

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

Voyez où est le bénéfice : maintenant nous avons un rappel automatique ( mon_callback ) qui sera déclenché dès que nous aurons les données. C'est tout ce qu'il y a à savoir sur JSONP : c'est un callback et des balises script.


NOTE :
Il s'agit d'exemples simples d'utilisation de JSONP, mais pas de scripts prêts pour la production.

Démonstration de RAW JavaScript (simple flux Twitter utilisant JSONP) :

<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>

Exemple basique de jQuery (simple flux Twitter utilisant JSONP) :

<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>

JSONP signifie JSON avec padding . (technique très mal nommée car elle n'a vraiment rien à voir avec ce que la plupart des gens considèrent comme du "rembourrage").

3 votes

Cette réponse est aujourd'hui quelque peu dépassée car les navigateurs supportent désormais Access-Control-Allow-Origin qui permettent d'effectuer des appels Ajax réguliers vers certains domaines d'origine croisée.

2 votes

Gardez à l'esprit que vous ne pouvez pas faire un formulaire POST avec JSONP. Plus d'informations ici : markhneedham.com/blog/2009/08/27/

4 votes

Que devez-vous prendre en compte si vous voulez que ces scénarios soient prêts pour la production ?

148voto

Petr Peller Points 1693

Il existe un moyen encore plus simple de travailler avec JSONP en utilisant jQuery.

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

El ? à la fin de l'URL indique à jQuery qu'il s'agit d'une requête JSONP au lieu de JSON. jQuery enregistre et appelle la fonction de rappel automatiquement.

Pour plus de détails, consultez le Documentation sur jQuery.getJSON .

2 votes

@PetrPeller, ça a l'air génial mais je n'arrive pas à en faire un produit. Pouvez-vous le voir une fois ? JSFiddle Il ne signale aucune donnée. Peut-être ai-je manqué quelque chose

0 votes

La réponse @xDNP JSONP doit être prise en charge par le serveur. Votre serveur ne semble pas le supporter car je ne vois pas de callback ajouté ici : mylivecanvas.com/api/ . Vous devez également utiliser &callback=? car ce n'est pas le premier paramètre dans votre cas.

1 votes

@PetrPeller Je suis très intéressé par votre solution. Mais, cela ne fonctionne pas pour moi. Je ne veux pas poster une nouvelle question mais cela ne m'aide pas. Que fait ne semble pas être pris en charge par le serveur c'est-à-dire ? Que dois-je faire ? Et pouvez-vous me donner une URL complète qui fonctionne pour mon serveur ? Je vous en serais reconnaissant. Ai-je besoin d'une configuration de serveur ?

28voto

PapaFreud Points 1115

En réponse à l'OP, il y a deux problèmes avec votre code : vous devez définir jsonp='callback', et ajouter une fonction de rappel dans une variable comme vous le faites ne semble pas fonctionner.

Mise à jour : lorsque j'ai écrit cet article, l'API de Twitter était simplement ouverte, mais elle a été modifiée et nécessite désormais une authentification. J'ai changé le deuxième exemple pour un exemple fonctionnel (2014Q1), mais en utilisant maintenant github.

Cela ne fonctionne plus - à titre d'exercice, voyez si vous pouvez le remplacer par l'API Github :

$('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);
};

bien qu'alert()ing un tableau comme ça ne fonctionne pas vraiment bien... L'onglet "Net" de Firebug vous montrera le JSON correctement. Une autre astuce pratique consiste à faire

alert(JSON.stringify(data));

Vous pouvez également utiliser le jQuery.getJSON méthode. Voici un exemple html complet qui obtient une liste de "gists" de github. De cette façon, il crée une fonction de rappel nommée au hasard pour vous, c'est le "callback= ?" final dans l'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 votes

Tu as raison, ça ne marche plus. Twitter a changé son API.

3voto

Ganesh Points 609
<!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> 

Le code ci-dessus permet d'obtenir des images à partir de l'API Flicker. Il utilise la méthode GET pour obtenir des images en utilisant JSONP. Vous trouverez plus de détails dans aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X