Déceler une requête Ajax en Php

Posé ici le lundi 21 juillet 2008 à 13:53 par Jay Salvat

Ajax Dorénavant les requêtes Ajax pleuvent de toute part. Il est très fréquent d'avoir à identifier une requête Ajax au niveau serveur pour adapter le contenu selon les cas. En effet, une portion de code pourra inclure un header et un footer lors de l'appel standard par un navigateur ou seulement être rafraichit telle quel lors de l'appel en Ajax.

Il n'existe pas de moyen automatique d'identifier ces requêtes. Les principales librairies javascript comme Prototype ou jQuery s'accordent pour envoyer un paramètre dans l'en-tête HTTP de la requête afin qu'elle puisse être reconnue. Ce paramètre est X-Requested-With : XMLHttpRequest. Tirons partie de cette information pour faire la fonction Php adéquate.

Lire l'en-tête HTTP renvoyée

La fonction qui suit est des plus simples. Les informations envoyées dans l'en-tête HTTP se récupèrent par la variable d'environnement PHP $_SERVER. Attention, en plus d'être en majuscule, toutes les informations de l'en-tête HTTP sont préfixés de HTTP_. Notre X-Requested-With se lira donc par $_SERVER['HTTP_X_REQUESTED_WITH']. Le reste coule de source.

Fonction Php de reconnaissance de la requête Ajax
<?php
/**  
 * Déceler une requête Ajax en Php
 * par Jay Salvat - http://blog.jaysalvat.com/  
 */  
function isAjax() {
    if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) 
        && $_SERVER['HTTP_X_REQUESTED_WITH'] == "XMLHttpRequest") {
        return true;
    }
    return false;
}
?>

Et si je n'utilise pas de librairie Ajax ?

Il n'est pas toujours utile d'inclure une libraire de 20 à 50ko sur un petit projet ne nécessitant que quelques requêtes Ajax. La bonne vieille méthode fait encore ses preuves. Votre bout de javascript devrait ressembler à quelque chose comme suit. Il suffit d'y inclure le nouveau paramètre à passer dans l'en-tête pour que notre requête puisse également être identifiée au niveau serveur.

Ajouter un paramètre au header en javascript
<script type="text/javascript">
    var xhr;
    if(window.XMLHttpRequest)	{ 
        xhr = new XMLHttpRequest();
    } else if(window.ActiveXObject) { 
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhr.open('post', 'ajax.php', true);

    // Ajouter une valeur au header
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

    xhr.send(null);
</script>

Conclusion

ed la même maniètre, il est facile d'améliorer d'autres librairies ne renvoyant pas encore cette information. Par exemple, IUI ou WebApp.net dédiée aux applications iPhone ne semblent malheureusement pas encore s'être accordées de ce côté là.

Trackbacks

0 trackback

Commentaires

2 commentaires

Pour IUI, c'est vrai mais avec WebApp.Net, on peut voir si la requête est une requête ajax.
Pour chaque requête, WebApp.Net envoie en GET deux paramètres :

Array
(
[__async] => true
[__source] => waHome
)

Donc, en voyant __async = true, on sait que c'est un un appel en ajax.

__source dépend de la page où est effectué la requête.

1. Par Worolf le mercredi 30 juillet 2008 à 19:59

Merci Worolf pour ce complément d'informations.

J'essaierai de prendre le temps de contacter l'auteur pour lui proposer d'ajouter le HTTP_X_REQUESTED_WITH qui devient peu à peu une sorte de norme.

2. Par Jay Salvat le jeudi 31 juillet 2008 à 18:08

Obligatoire. Vrai nom apprécié.

Il ne sera ni affiché, ni spammé.

Votre blog ou votre site web.

Constructif, courtois et correctement écrit. SMS proscrit. Merci.