994 votes

Demande GET HTTP en JavaScript ?

Je dois faire un HTTP GET en JavaScript. Quelle est la meilleure façon de le faire ?

J'ai besoin de faire cela dans un widget dashcode Mac OS X.

15 votes

Notez que cela est soumis à la politique de la même origine. fr.wikipedia.org/wiki/Same_origin_policy

1417voto

Joan Points 3381

Les navigateurs (et Dashcode) fournissent un objet XMLHttpRequest qui peut être utilisé pour effectuer des requêtes HTTP à partir de JavaScript :

function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
    xmlHttp.send( null );
    return xmlHttp.responseText;
}

Cependant, les demandes synchrones sont déconseillées et génèrent un avertissement du type :

Remarque : à partir de Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), les requêtes synchrones sur le thread principal ont été dépréciées en raison des effets négatifs sur l'expérience de l'utilisateur.

Vous devez faire une demande asynchrone et traiter la réponse dans un gestionnaire d'événements.

function httpGetAsync(theUrl, callback)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() { 
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
            callback(xmlHttp.responseText);
    }
    xmlHttp.open("GET", theUrl, true); // true for asynchronous 
    xmlHttp.send(null);
}

0 votes

Cette solution est intéressante, mais il convient de noter qu'IE 10 déclenche une alerte de sécurité lorsqu'il l'utilise et tente d'accéder à une url dans un domaine différent de celui de la page.

2 votes

Bien sûr, Javascript l'a intégré, sinon comment une bibliothèque Javascript pourrait-elle proposer une méthode pratique pour cela ? La différence est que les méthodes pratiques offrent, eh bien, la commodité, et une syntaxe plus claire et plus simple.

14 votes

Préfixe XML car il utilise le X de AJAX ~ JavaScript asynchrone et XML . Aussi, bon point concernant le " API qui a une liaison ECMAScript "est dû au fait que JavaScript peut se trouver dans beaucoup de choses, autres que les navigateurs supportant HTTP (par exemple, Adobe Reader...) C'est une bonne chose à retenir, alors chapeau à PointedEars.

208voto

Pistos Points 8997

Dans jQuery :

$.get(
    "somepage.php",
    {paramOne : 1, paramX : 'abc'},
    function(data) {
       alert('page content: ' + data);
    }
);

5 votes

Notez que cela ne fonctionne pas dans IE 10 lorsque vous essayez d'accéder à une url dans un domaine différent de celui de la page.

6 votes

@BornToCode vous devriez enquêter davantage et éventuellement ouvrir un bug sur le jQuery issue tracker dans ce cas.

114 votes

Je sais que certaines personnes veulent écrire du Javascript pur. Je comprends cela. Je n'ai aucun problème à ce que les gens fassent cela dans leurs projets. Mon "En jQuery :" devrait être interprété comme "Je sais que vous m'avez demandé comment le faire en Javascript, mais laissez-moi vous montrer comment le faire avec jQuery, afin que votre curiosité soit piquée en voyant le genre de concision et de clarté syntaxique dont vous pouvez bénéficier en utilisant cette bibliothèque, qui vous offrira également de nombreux autres avantages et outils".

175voto

tggagne Points 400

Beaucoup d'excellents conseils ci-dessus, mais pas très réutilisables, et trop souvent remplis d'absurdités DOM et d'autres trucs qui cachent le code facile.

Voici une classe Javascript que nous avons créée et qui est réutilisable et facile à utiliser. Actuellement, elle n'a qu'une méthode GET, mais cela fonctionne pour nous. L'ajout d'une méthode POST ne devrait pas mettre à l'épreuve les compétences de quiconque.

var HttpClient = function() {
    this.get = function(aUrl, aCallback) {
        var anHttpRequest = new XMLHttpRequest();
        anHttpRequest.onreadystatechange = function() { 
            if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200)
                aCallback(anHttpRequest.responseText);
        }

        anHttpRequest.open( "GET", aUrl, true );            
        anHttpRequest.send( null );
    }
}

Pour l'utiliser, rien de plus simple :

var client = new HttpClient();
client.get('http://some/thing?with=arguments', function(response) {
    // do something with response
});

0 votes

Erreur UnCaughtReference, HttpClient n'est pas défini . J'obtiens cette erreur à la première ligne.

0 votes

Comment l'appeler depuis le html onClick ?

0 votes

Créez une fonction else where qui contient le var client... et exécutez simplement functionName() ; return false ; dans le onClick.

102voto

aNieto2k Points 271

Une version sans callback

var i = document.createElement("img");
i.src = "/your/GET/url?params=here";

2 votes

Excellent ! J'avais besoin d'un script Greasemonkey pour garder une session en vie et ce snippet est parfait. Je l'ai juste enveloppé dans un setInterval appeler.

10 votes

Comment obtenir le résultat ?

2 votes

@user4421975 Vous ne comprenez pas - pour avoir accès à la réponse à la demande, vous devez utiliser le XMLHttpRequest mentionné ci-dessus à la place.

75voto

rp. Points 9997

Voici un code pour le faire directement avec JavaScript. Mais, comme indiqué précédemment, il est préférable d'utiliser une bibliothèque JavaScript. Ma préférée est jQuery.

Dans le cas ci-dessous, une page ASPX (qui sert de service REST pour les pauvres) est appelée pour renvoyer un objet JavaScript JSON.

var xmlHttp = null;

function GetCustomerInfo()
{
    var CustomerNumber = document.getElementById( "TextBoxCustomerNumber" ).value;
    var Url = "GetCustomerInfoAsJson.aspx?number=" + CustomerNumber;

    xmlHttp = new XMLHttpRequest(); 
    xmlHttp.onreadystatechange = ProcessRequest;
    xmlHttp.open( "GET", Url, true );
    xmlHttp.send( null );
}

function ProcessRequest() 
{
    if ( xmlHttp.readyState == 4 && xmlHttp.status == 200 ) 
    {
        if ( xmlHttp.responseText == "Not found" ) 
        {
            document.getElementById( "TextBoxCustomerName"    ).value = "Not found";
            document.getElementById( "TextBoxCustomerAddress" ).value = "";
        }
        else
        {
            var info = eval ( "(" + xmlHttp.responseText + ")" );

            // No parsing necessary with JSON!        
            document.getElementById( "TextBoxCustomerName"    ).value = info.jsonData[ 0 ].cmname;
            document.getElementById( "TextBoxCustomerAddress" ).value = info.jsonData[ 0 ].cmaddr1;
        }                    
    }
}

37 votes

Puisque cette réponse est l'un des premiers résultats de la recherche "http request javascript", il est utile de mentionner que l'exécution d'eval sur les données de réponse comme cela est considéré comme une mauvaise pratique.

12 votes

@Kloar bon point, mais ce serait encore mieux de donner la raison pour laquelle c'est mauvais, qui je suppose est la sécurité. Expliquer pourquoi les pratiques sont mauvaises est le meilleur moyen d'inciter les gens à changer leurs habitudes.

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