Comment bien tester une requête AJAX avec PHP

Vous avez réussi à effectuer un appel serveur avec AJAX, c'est bien. Mais encore faut-il vous assurer que votre programme réagira correctement si l'appel ne fonctionne pas.

Même si vous utilisez un algorithme fourni par un as de la programmation, ne vous y fiez jamais. Vous devez toujours prendre soin de tout tester. Qui sait, vous pourriez peut-être avoir l'occasion d'épater l'auteur qui vous a fourni sa structure de code en apportant des amélioration à son précieux code !

Comme le nombre de causes d'erreur possibles est élevé, cet article vous présent quelques pistes pour vous aider.

▼Publicité

Erreur dans les données fournies par l'usager

Avant même de tester l'appel AJAX, vous devez vous assurer que le programme affichera un message à l'usager si les données d'entrée ne sont pas valides. 

Une première validation devrait avoir lieu côté client. Cependant, certaines validations nécessitent le travail du serveur. Ce serait le cas, par exemple, d'un formulaire contenant une liste déroulante dont les valeurs sont tirées de la base de données. Si une option était sélectionnée puis forgée par un usager malveillant (ex : dans Chrome, F12 puis double-clic sur la valeur d'une balise <option> pour modifier sa valeur), le code serveur devrait réagir et retourner (faire un echo) une valeur qui témoigne du problème rencontré.

Dans un tel cas, l'appel AJAX sera réussi mais dans la fonction de rappel associée au jqXHR.done(), un message d'erreur approprié devrait apparaître.

Erreur lors de l'appel AJAX

La fonction jqXHR.fail() entre en action lorsque l'appel AJAX n'est pas réussi.

C'est ici que les causes d'erreur peuvent être les plus diversifiées. 

Vous pouvez tester les cas suivants.

Mauvais nom de programme PHP

La méthode AJAX reçoit, dans son élément url, le nom du programme PHP à exécuter. Ex : url: 'enregistrer-commentaire.php'.

Si vous modifiez le nom du fichier pour un nom qui n'existe pas, l'appel AJAX échouera et vous obtiendrez les données suivantes sur l'erreur :

  • textStatus: error 
  • errorThrown: Not found 
  • jqXHR.responseText: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE...>...<h1>Objet non trouv&eacute;!</h1><p>L'URL demand&eacute;e n'a pas pu &ecirc;tre trouv&eacute;e sur ce serveur. ...

Le message d'erreur codé dans la fonction de rappel associée au .fail() devrait apparaître.

Délai expiré

Par défaut, il n'y a aucune limite de temps pour réaliser un appel AJAX. Cependant, certains navigateurs peuvent arrêter un appel AJAX après un délai déterminé. Le délai peut également être fixé par le serveur ou même directement par l'appel AJAX. Il est donc important de tester le comportement du programme en cas de dépassement du délai autorisé.

Il serait possible, bien sûr, d'ajouter une longue pause dans la fonction serveur appelée par AJAX. Ceci vous oblige cependant à passer de longues périodes de temps à attendre devant l'écran pour voir ce qui se passera quand le délai sera dépassé. Pas très intéressant...

La technique la plus simple est de configurer l'appel AJAX pour limiter le délai à une milliseconde. Cette configuration sera retirée une fois le test complété.

Ex :

JavaScript

var jqxhr = $.ajax({

    timeout: 1,

    ...

});

Lors de l'exécution du programme, un dépassement du délai surviendra et vous obtiendrez les données suivantes sur l'erreur :

  • textStatus: timeout
  • errorThrown: timeout 
  • jqXHR.responseText: undefined

Le message d'erreur codé dans la fonction de rappel associée au .fail() devrait apparaître.

Type de données attendu (élément dataType) ne correspond pas au type retourné par le code serveur

Les données retournées par le code serveur (ou plutôt le contenu du echo) sont formatées selon ce qui a été spécifiée dans l'élément dataType: (ex : dataType: "json").

Si vous spécifiez un type attendu qui ne correspond pas à ce que le code serveur retourne, la valeur retournée sera mal encodée et l'appel AJAX échouera.

Vous obtiendrez alors les données suivantes sur l'erreur :

  • textStatus: parsererror
  • errorThrown: SyntaxError: Unexpected token <
  • jqXHR.responseText: Le texte encodé par le code serveur.

Le message d'erreur codé dans la fonction de rappel associée au .fail() devrait apparaître.

Mauvais encodage des données envoyées au code serveur

Inversement, si vous spécifiez dans l'élément contentType: un type de données qui ne correspond pas à ce qui est envoyé au code serveur, l'appel AJAX réussira mais vous devrez réagir correctement dans le .done().

Vous obtiendrez les données suivantes sur l'erreur :

  • textStatus: success
  • errorThrown: Not available
  • jqXHR.responseText: Le contenu message d'erreur PHP indiquant que la variable $_POST correspondant aux données transférées n'a pas pu être retrouvée.

Un message d'erreur codé dans la fonction de rappel associée au .done() devrait apparaître si vous avez bien validé le contenu de la variable response.

Erreur à l'intérieur du code serveur

Il pourrait arriver qu'un problème survienne à l'intérieur même du code serveur. Par exemple, on pourrait avoir fait une erreur de syntaxe comme un simple oubli de point-virgule. De façon surprenante, PHP réagit en considérant l'appel AJAX réussi.

Dans un tel cas, le message de l'erreur PHP remplacera le echo que le code serveur aurait normalement fait. Dans le .done(), la variable response contiendra donc un code d'erreur PHP (ex : "<br /><b>Parse error</b>:  syntax error, ... in <b>...</b> on line <b>...</b><br />").

Ici encore, la fonction de rappel associée au .done() devra bien valider la variable response afin de détecter si elle correspond à un message d'erreur PHP.

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories