IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Retour "$.ajax" null avec REST


Sujet :

jQuery

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut Retour "$.ajax" null avec REST
    Bonjour,

    Je veux faire de l'appel à des services rests avec de l'Ajax, j'ai donc :

    JQuery -> appel Ajax -> Serveur Php -> retour (json)

    Pour l'appel, j'utilise la méthode JQuery "$.ajax", qui permet de spécifier un comportement de retour en cas de succès ou d'erreur en fonction du statut http retourné, voilà le code de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $.ajax({
      url:"/restservice/ConnexionRestService.php",
      type:"GET",
      data:"cmd=login&profil="+JSON.stringify($scope.profil),
      dataType:"json",
      success: function(data){
    	  alert('OK : ' + data.responseText);
      },
      error:function (data) {
    	  alert('error : ' + data.responseText);
      }
    });
    Et voilà mon code PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    try {
    	$profil = ParameterGetter::getRequestParameter("profil",true);
    	$compte = CompteService::getCompte($profil["login"], $profil["password"]);
    	ParameterGetter::setSessionParameter("compte", $compte);
    	$this->response($this->json($compte), 200, 'json');
    } catch (MissingDataException $e) {
    	$resultatJSON = $this->json(array("listeMessageErreur", "Impossible de se connecter, mauvais login/mot de passe"));
    	$this->response($resultatJSON, 204,'json');
    }
     
    public function response($data,$status,$format){
    	$this->_code = ($status)?$status:200;
    	$this->set_headers($format);
    	echo $data;
    	exit;
    }
     
    private function set_headers($format){
    	header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
    	//header("Content-Type:".$this->_content_type);
    	if($format =='json')
    	{
    	   header("Content-Type:".$this->json_content_type);
    	}
    	elseif($format =='xml')
    	{
    	   header("Content-Type:".$this->xml_content_type);
    	}
    	else
    	{
    		 header("Content-Type:text/plain");
    	}
    }

    Dans mon test, je passe un mauvais login/mot de passe. en l'état actuel des choses, quand je teste, la MissingDataException est catchée dans le php, et le code renvoyé est 204.
    Mon code va dans la méthode de retour "Success", mais là "data" est égal à null.
    Ce qui est très perturbant, c'est que si je change, dans mon php, le 204 par 404, mon code exécuté est celui de la méthode de retour error, et là mon message d'erreur est bien présent dans le data...

    Dites moi si d'autres parties du code peuvent être utiles à la compréhension du problème, mais là je sèche complet...

    Une idée?

    Merci d'avance !

  2. #2
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    Dans le code source de JQuery le contenu est considéré comme succès si cette condition est vérifié

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    if( status >=200&& status <300|| status ===304)

    Alors le code que tu donne c'est normale que ça part dans succès, alors tu as deux choix au moins :
    1.Vu que tu maîtrise tes codes que tu renvoie c'est simple tu peu faire un switch dans les codes que tu reçoit et dans Jquery la méthode success s'execute en vous renvoyant trois paramètres, y compris le code du statu, la méthode est défini comme ça : success(data, textStatus, jqXHR) Donc tu peux tester si le jqXHR.status est égale à 204.
    2. Sinon, il faut dans ton code php renvoyer un code supérieur ou égal à 300 et différent de 304 ou un code inférieur strictement à 200.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Merci pour cette réponse, qui me permet d'y voir un peu plus clair.
    J'ai l'impression que tout fonctionne avec ce code :

    JS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $.ajax({
      url:"/restservice/ConnexionRestService.php",
      type:"GET",
      data:"cmd=login&profil="+JSON.stringify($scope.profil),
      contentType:"application/json; charset=utf-8",
      dataType:"json",
      success: function(data, textStatus, jqXHR){
    	  if (jqXHR.status == 204) {
    		  alert("Donnée manquante");
    	  } else if (jqXHR.status == 200) {
    		  alert("Connecté : " + data);
    	  }		  
      },
      error:function (data) {
    	  alert('error : ' + data);
      }
    });
    PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    private function login() {
    	try {
    		$profil = json_decode(ParameterGetter::getRequestParameter("profil",true));
    		$login = $profil->login;
    		$password = $profil->password;
    		Logger::getLogger()->logInfo("Login reçu :  $login");
    		Logger::getLogger()->logInfo("Password reçu :  $password");
    		$compte = CompteService::getCompte($login, $password);
    		ParameterGetter::setSessionParameter("compte", $compte);
    		$this->response(json_encode($compte), 200, 'json');
    	} catch (MissingDataException $e) {
    		$resultat = json_encode(array("listeMessageErreur" => "Impossible de se connecter, mauvais login ou mot de passe"));
    		Logger::getLogger()->logInfo("Donnée manquante, réponse :  $resultat");
    		$this->response($resultat, 204,'json');
    	} catch (Exception $e) {
    		$resultat =json_encode(array("listeMessageErreur"=>"Erreur inattendue"));
    		Logger::getLogger()->logInfo("Erreur inattendue, réponse :  $resultat");
    		$this->response($resultat, 500,'json');
    	}
    }

    Le seul "mystère" restant, c'est que dans le cas particulier du message 204, l'erreur n'est pas remontée et le data est null (j'imagine que c'est un code qui n'accepte pas de détail ou une histoire comme ça...),mais rien de bloquant de toute manière, c'est effectivement un code qui parle de lui même

    En tout cas, mon problème est résolu et mon get fonctionne, maintenant je croise les doigts pour mon premier POST que je ferai

    D'ailleurs si quelqu'un connait un bon tuto qui pourrai répondre aux questions que je me pose :
    • Dans le javascript, quelle est la différence entre le contentType et le dataType?
    • Quelle sont clairement les contraintes qui apparaissent en fonction de si on spécifie GET ou POST?
    • Comment il s'y retrouve alors que dans mon data, je mélange un paramètre texte et un paramètre JSON
    • ...


    Je suis largement preneur, parce que là, j'avance à taton !

    Merci encore pour le coup de pouce !

  4. #4
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    Citation Envoyé par legentil Voir le message
    Le seul "mystère" restant, c'est que dans le cas particulier du message 204, l'erreur n'est pas remontée et le data est null
    Tu es sûr que l'exception est catché et que la fonction result est bien exécute? tu peux tester à vouloir afficher dans le navigateur en la requête erroné sans appel ajax et voir ce que ça donne.
    Citation Envoyé par legentil Voir le message

    • Dans le javascript, quelle est la différence entre le contentType et le dataType?
    Le contenType est celle qui est mis en des les headers lorsqu'on envoie une requête au serveur, et celle qui est aussi mis dans la réponse, et le navigateur peut aussi reconnaître le contentType, c'est ce qui fait que si le contentType est au format json ou xml, même si la réponse est une page html normal le navigateur ne l'affiche pas comme il affiche le DOM interprété, mais il l'affiche brut comme lorsqu'on affiche le source de la page.
    Mais le dataType ça c'est propre à JQuery quel genre de format de données il doit attendre, qui sont les format json, xml ou HTML. Possible que le contenType soit du text plain mais le contenu soit du json pure, JQuery peut gérer ça.

    Citation Envoyé par legentil Voir le message

    • Quelle sont clairement les contraintes qui apparaissent en fonction de si on spécifie GET ou POST?
    Si tu spécifie GET dans un formulaire l'utilisateur verra tout son contenu s'afficher sur la barre du navigateur une fois il clique sur envoyer, même des mots de passes. Déjà pour les mots de passes on utilise le https et avec ça on chiffre le mot de passe, et ça passe aussi avec POST. La requête GET est aussi enregistré dans ton historique du navigateur comme un lien consulté, alors si tu avais un jour soumit un formulaire tu l'aura dans ton historique avec tout les données envoyés s'afficher sur la barre de navigation si tu clique sur le lien en soi.

    Les gens qui ont conçu le Get ont voulu que ça soit utilisé lorsqu'on envoie un requête et on attend une réponse, c'est ce qui est sur le serveur qu'on a besoin vraiment pas ce qu'on envoie, et le POST au contraire le but principal c'est l'envoie d'un ensemble de données au serveur, c'est ce qu'on veut poster au serveur qui est plus important pour nous, pas la petite réponse de succès qui va s'afficher une fois tout est ok. Vu que l'architecture c'est client/serveur alors dans tous les cas il y a requête/réponse.

    Citation Envoyé par legentil Voir le message

    • Comment il s'y retrouve alors que dans mon data, je mélange un paramètre texte et un paramètre JSON
    A ma connaissance JQuery ne gère qu'un seul type de données spécifié à la fois, si tu envoie du Json alors que par défaut tu n'a pas spécifié mais que c'est du text plain, alors quand tu voudra parser ton contenu vers un objet json c'est là ou tu l'aura dans ta tête si le contenu ne respecte pas le format voulu.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo