127 votes

Comment faire une requête JSONP à partir de Javascript sans JQuery ?

Puis-je effectuer une requête JSONP inter-domaine en JavaScript sans utiliser jQuery ou une autre bibliothèque externe ? Je voudrais utiliser JavaScript lui-même, puis analyser les données et en faire un objet pour pouvoir les utiliser. Dois-je utiliser une bibliothèque externe ? Si non, comment puis-je le faire ?

0 votes

6voto

robertodecurnex Points 1411

J'ai une bibliothèque javascript pure pour faire cela https://github.com/robertodecurnex/J50Npi/blob/master/J50Npi.js

Jetez-y un coup d'œil et faites-moi savoir si vous avez besoin d'aide pour utiliser ou comprendre le code.

En fait, vous avez un exemple d'utilisation simple ici : http://robertodecurnex.github.com/J50Npi/

6 votes

Votre solution était un peu trop simple pour mon cas d'utilisation, j'ai donc ajouté la prise en charge des demandes multiples. gist.github.com/1431613

5voto

Konstantin Tarkus Points 16862
/**
 * Loads data asynchronously via JSONP.
 */
const load = (() => {
  let index = 0;
  const timeout = 5000;

  return url => new Promise((resolve, reject) => {
    const callback = '__callback' + index++;
    const timeoutID = window.setTimeout(() => {
      reject(new Error('Request timeout.'));
    }, timeout);

    window[callback] = response => {
      window.clearTimeout(timeoutID);
      resolve(response.data);
    };

    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.async = true;
    script.src = url + (url.indexOf('?') === -1 ? '?' : '&') + 'callback=' + callback;
    document.getElementsByTagName('head')[0].appendChild(script);
  });
})();

Exemple d'utilisation :

const data = await load('http://api.github.com/orgs/kriasoft');

3voto

Fresheyeball Points 11655

J'ai écrit une bibliothèque pour gérer cela, aussi simplement que possible. Pas besoin de la rendre externe, c'est juste une fonction. Contrairement à d'autres options, ce script nettoie après lui-même, et est généralisé pour faire d'autres demandes au moment de l'exécution.

https://github.com/Fresheyeball/micro-jsonp

function jsonp(url, key, callback) {

    var appendParam = function(url, key, param){
            return url
                + (url.indexOf("?") > 0 ? "&" : "?")
                + key + "=" + param;
        },

        createScript = function(url, callback){
            var doc = document,
                head = doc.head,
                script = doc.createElement("script");

            script
            .setAttribute("src", url);

            head
            .appendChild(script);

            callback(function(){
                setTimeout(function(){
                    head
                    .removeChild(script);
                }, 0);
            });
        },

        q =
            "q" + Math.round(Math.random() * Date.now());

    createScript(
        appendParam(url, key, q), function(remove){
            window[q] =
                function(json){
                    window[q] = undefined;
                    remove();
                    callback(json);
                };
        });
}

2voto

Mayur S Points 701

Veuillez trouver ci-dessous JavaScript exemple pour faire un JSONP sans JQuery :

Vous pouvez également consulter mon GitHub pour référence.

https://github.com/shedagemayur/JavaScriptCode/tree/master/jsonp

window.onload = function(){
    var callbackMethod = 'callback_' + new Date().getTime();

    var script = document.createElement('script');
    script.src = 'https://jsonplaceholder.typicode.com/users/1?callback='+callbackMethod;

    document.body.appendChild(script);

    window[callbackMethod] = function(data){
        delete window[callbackMethod];
        document.body.removeChild(script);
        console.log(data);
    }
}

0voto

Chris Ferdinandi Points 1724
/**
 * Get JSONP data for cross-domain AJAX requests
 * @private
 * @link http://cameronspear.com/blog/exactly-what-is-jsonp/
 * @param  {String} url      The URL of the JSON request
 * @param  {String} callback The name of the callback to run on load
 */
var loadJSONP = function ( url, callback ) {

    // Create script with url and callback (if specified)
    var ref = window.document.getElementsByTagName( 'script' )[ 0 ];
    var script = window.document.createElement( 'script' );
    script.src = url + (url.indexOf( '?' ) + 1 ? '&' : '?') + 'callback=' + callback;

    // Insert script tag into the DOM (append to <head>)
    ref.parentNode.insertBefore( script, ref );

    // After the script is loaded (and executed), remove it
    script.onload = function () {
        this.remove();
    };

};

/** 
 * Example
 */

// Function to run on success
var logAPI = function ( data ) {
    console.log( data );
}

// Run request
loadJSONP( 'http://api.petfinder.com/shelter.getPets?format=json&key=12345&shelter=AA11', 'logAPI' );

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