skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

jeudi 18 juin 2009

Commentaire sur la création de WSDL en PHP

Publié par Infinite Loop, à 22 h 04 6 commentaires

Aujourd'hui, j'ai reçu sur mon blogue un commentaire anonyme concernant l'article que j'ai écrit le 21 mai dernier intitulé "Créer un WSDL facilement avec Zend Framework". J'ai été un peu surpris par les propos de l'auteur, légèrement agressif, qui ne m'a laissé aucun moyen de le rejoindre directement (aucun nom ni courriel). Autrement, je l'aurais invité à m'envoyer son code et j'aurais été heureux de l'aider car l'exemple que j'avais publié provenait d'un cas réel que j'utilise dans un de mes projets.

Plutôt que d'approuver son commentaire, j'ai décidé de le publier ici et d'y consacrer ma chronique quotidienne. En guise d'introduction, voici le texte intégral:

dsl de te decevoir mais ton machin marche pas!!!!!
J'ai retourné le serveur dans tous les sens, rien à faire j'avais le message : "Couldn't load from...". C'est uniquement quand j'ai enlevé la condition 'if'-'else- que j'ai pu avoir le WSDL.
Quant au client il a l'air simple mais ne fonctionne pas non plus. désolé...

Le titre est attrayant les commentaires bien réalisés mais le résultat est insatisfaisant.

OK, c'est possible que j'aie fait une erreur, elle est humaine. J'ai peut-être mal expliqué un détail ? Ou fait une gaffe en recopiant le code ? Pourtant, je viens de le tester à nouveau et ça marche très bien. Et ça se peut que le programmeur en question ait fait un code 18. Tout porte à croire que c'est le cas.

La preuve est que j'ai su reproduire le bogue en moins d'une minute en introduisant volontairement une erreur d'implémentation. Le message obtenu se trouve dans le tag faultstring du XML et affiche quelque chose qui ressemble à ceci :

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://localhost/WSDL/service.php?wsdl' : failed to load external entity "http://localhost/WSDL/service.php?wsdl"

Que nous dit cette notice ? Que le service web ne se charge pas correctement. Et si du côté serveur ça ne fonctionne pas, ce n'est pas surprenant que le client n'ait pas plus de succès. Il faut régler le problème à la source.

Une des causes possibles est que "localhost" n'ait pas été modifié pour rediriger vers son propre domaine. Il faut comprendre que mon code est sur mon propre serveur de développement hébergé sur ma machine (127.0.0.1), donc j'utilise localhost pour ma démo. Une autre possibilité est que son service web ne soit pas hébergé dans un répertoire du même nom que le mien ou que le fichier n'ait pas le bon nom.

Si on jete un oeil au code du fichier service.php, le IF/ELSE sert à deux choses. D'abord à générer la définition du WSDL en mode AutoDiscover (lorsqu'on lui passe en query string le paramètre "wsdl"), sinon à prendre en charge les demandes des clients. Donc le même fichier est réutilisé pour deux comportements différents au lieu de séparer le code en deux fichiers PHP sur le disque.

C'est important aussi de remarquer que dans le ELSE, l'objet Zend_Soap_Server prend en paramètre l'URL de la définition du service web, donc le fichier service.php AVEC le paramètre "wsdl". Si on ne fournit pas l'URL correctement ou si on omet de mettre le paramètre wsdl (celui détecté par le $_GET['wsdl'], le message "Couldn't load from 'url'" apparaît. Au moment de prendre en charge la requête du client, le fichier s'appelle lui-même en réclamant la définition pour instancier Zend_Soap_Server.

En résumé :

  • L'accès à la page service.php?wsdl affichera le XML de la définition du service
  • L'accès direct à la page service.php (sans ?wsdl) devrait faire afficher un faultstring Invalid XML car aucune requête à une fonction n'est faite
  • Le client doit appeler le WSDL en utilisant l'URL complet "http://votre-serveur/service.php?wsdl". Ceci a pour effet d'interroger le service pour savoir quelles fonctions il peut appeler.
Ici, je me permets une réflexion. Parfois, je me demande si la nouvelle génération de programmeurs tente vraiment de comprendre ce qu'ils font ou s'ils ne sont pas plutôt à la recherche de code et de solutions toutes prêtes à être copiées/collées à leurs projets. Ai-je besoin de rappeler que "Copier/Coller" ne fait PAS parti de la liste des "Design Pattern" ?

Même en présentant un code fonctionnel dans sa plus simple expression, son exécution a affiché une erreur explicite et le programmeur n'a pas su chercher la solution au bon endroit. Pourtant, ce n'est que quelques lignes de code, alors nul besoin de retourner le serveur dans tous les sens ;-)


Tags: PHP, Programmation, Zend Framework

6 réponses à "Commentaire sur la création de WSDL en PHP"

  1. Laurent a dit...
    19 juin 2009 à 11 h 04

    Ce blog est tout bonnement brillant.
    Il fait partie de mon top 10.
    Alors inutile de s'attarder sur qq boulets aussi agressifs qu'ignares.
    Félicitations et Bonne continuation.

    Infinite Loop a dit...
    19 juin 2009 à 13 h 43

    Merci Laurent, c'est apprécié. Ceci dit, ça me fera toujours plaisir de répondre aux questions et de donner un coup de main aux programmeurs s'ils rencontrent des problèmes :-)

    thbenda a dit...
    25 janvier 2011 à 10 h 50

    En effet,

    Je partage largement votre point de vue sur la quantité de personnes qui utilisent sans modération copier/coller, même au sein de structures réputées sérieuses (SSII, webagencies, etc.) !

    Le plus insupportable est encore l'arrogance de leur ignorance !

    Anonyme a dit...
    6 juillet 2011 à 09 h 30

    bonjour, alors voila j'ai développer un site en php qui utilise des webs services via soap. Sur ma machine de test tout fonctionne parfairtement, mais une fois en prod j'obtiens des erreurs SOAP de ce type:

    SOAP-ERROR: Parsing WSDL: Couldn't load from 'nom du serveur?wsdl' : failed to load external entity "nom du serveur?wsdl"

    le module SOAP est bien activé sur le serveur apache et libxml de même...

    Anonyme a dit...
    6 juillet 2011 à 11 h 21

    problème résolut, une ligne dans le fichier hosts donnait comme résolution du nom de domaine de la machine son ip privée. Comme la machine qui héberge les web services héberge également le site cela ne pouvait pas fonctionner...

    Infinite Loop a dit...
    7 juillet 2011 à 17 h 04

    Tant mieux si tu as résolu ton problème :)


Publier un commentaire

Message plus récent Messages plus anciens Accueil
S'abonner à : Publier des commentaires (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (56)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ▼  2009 (430)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ▼  juin 2009 (38)
        • Clone de lightbox pour jQuery
        • Nouveautés cette semaine
        • Thèmes pour Notepad++
        • Trouver de l'emploi en web au Québec ?
        • Citation no. 36 sur le silence
        • SSH2 : capturer le résultat d'une commande
        • Michael Jackson renaît grâce à son sosie !
        • Personnaliser les extensions de fichiers web
        • Remplacer APC par Zend_Cache
        • APC cache pour optimiser la performance
        • Norton Antivirus expire en direct chez Fox
        • Code source du Kindle d'Amazon
        • Netbeans et l'encodage UTF-8
        • Disque dur de 15 mega-octets de Radio Shack
        • Filtres de fichiers pour FileZilla FTP
        • Citation no. 35 sur l'histoire
        • Exclure les fichiers de projets avec TortoiseSVN
        • Mario Lemieux, un fin connaisseur de l'informatique ?
        • Commentaire sur la création de WSDL en PHP
        • Queue de fonctions en JavaScript
        • Équivalences Ajax avec jQuery et Prototype
        • Magazine Maximum PC en PDF
        • Film Home de Yann Arthus-Bertrand
        • Citation no. 34 sur la responsabilité
        • 6 destinations vacances aux noms insolites
        • À propos des chargés de projets
        • Astuce SQL pour remplacer les sous-requêtes
        • Message créatif et original de CD Baby
        • Composant HTML Purifier
        • Facebook mal programmé ?
        • Enregistrer des disques vinyls sur son ordinateur
        • Citation no. 33 sur les risques du travail
        • Full Text Search PostgreSQL
        • Lois du travail de Dilbert
        • Convertir Windows XP Home à Professional
        • Un site web all dressed avec bacon
        • 3 façons de construire une query string en PHP
        • Retirer un site malicieux de l'index Google
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft