|
| [WD17] Webservice API REST et Windev |
| Iniciado por Rémy, 13,abr. 2012 00:44 - 14 respuestas |
| |
| | | |
|
| |
Miembro registrado 48 mensajes |
|
| Publicado el 13,abril 2012 - 00:44 |
Bonjour à tous,
je dois interagir avec une API basé sur REST. Quand j'utilise la méthode GET pour récupérer du XML, c'est ok.
Par contre, je rencontre une erreur lorsque je veux faire une modification en utilisant PUT du protocole Http. En effet, il faut envoyer un fichier XML contenant le fichier récupéré en GET, mais modifié.
Le Webservice me retourne une erreur (mais trop générique pour pouvoir avec une piste). <errors> <error> <message><![CDATA[Internal error. To see this error please display the PHP errors.]]></message> </error> <errors> Mes erreurs PHP sont display, mais le problème ne vient pas de là. C'est une erreur générique du webservice (mal fichu et pas verbeux pour un sou).
J'ai fais des tests avec le plugin firefox "Poster" (envoi de requêtes paramétrées), et le webservice fonctionne correctement. Je retrouve mon erreur lorsque je passe, par exemple, un mauvais fichier XML.
Je pense que le problème vient de mon HTTPAjouteParametre ou HTTPAjouteFichier qui n'ont pas les bons paramètres ou autre...
Voici mon code :
l_sMonSiteUrl est une chaine = "127.0.0.1/customers/3" // url de mon webservice qui est correct. Modification de mon client id 3 l_APIKey est une chaine = "BALJHAZ56543AZBALJHAZ56543AZ" // clé API pour authentification, pas besoin de mot de passe HTTPCréeFormulaire( "FORM" ) // création du formulaire à envoyer // Attachement du fichier XML SI PAS HTTPAjouteFichier("FORM","","C:\Users\symphony\Desktop\client_detail.xml", "text/xml" ) ALORS Erreur("Attachement fail") FIN // Envoi du formulaire SI HTTPEnvoieFormulaire( "FORM", l_sMonSiteUrl, httpPut, "", "", "application/x-www-form-urlencoded", l_APIKey, "" ) info ( HTTPDonneRésultat() ) SINON Erreur( "ERREUR : " + ErreurInfo() ) FIN
J'ai essayé aussi en changeant le type MIME de mon fichier à ajouter en "application/xml" au lieu de "text/xml" J'ai également essayé de charger mon fichier xml dans une variable et de l'envoyer en faisant un HTTPAjouteParametre ( "FORM", "", l_sMonFichierXMLTexte )
Mais rien y fait.
A votre bon coeur !  |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 48 mensajes |
|
| Publicado el 13,abril 2012 - 15:56 |
Je n'arrive toujours pas a envoyer ma méthode PUT convenablement 
Je viens d'essayer ça :
SI HTTPRequête(l_sMonSiteUrl, "" , "X-HTTP-Method-Override: PUT", l_sTexte, "", l_APIKey, "" ) ALORS SAI_response = HTTPDonneRésultat() SAI_response += RC + RC + HTTPDonneRésultat(httpEntête) SINON SAI_response = "ERREUR : " + ErreurInfo() FIN
Mais ne fonction toujours pas 
Des idées ?
-- ----------------------------------- |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 48 mensajes |
|
| Publicado el 13,abril 2012 - 16:22 |
Après des heures et des heures je viens de trouver...
Le content-type du formulaire ne convenait pas, par conséquent le moteur PHP interprétait les balises ouvrantes XML < comme du texte url encodé %3C. Il faut donc mettre comme content-type ou <type du formulaire> dans la fonction httpEnvoieFormulaire (6ème paramètre) : text/xml
La bonne synthaxe est donc :
HTTPAjouteParamètre( "FORM", "", l_sTexte ) SI HTTPEnvoieFormulaire( "FORM", l_sMonSiteUrl, httpPut, "", "", "text/xml", l_APIKey, "" ) ALORS SAI_retour = "Envoi formulaire OK" SAI_response = HTTPDonneRésultat() SINON SAI_retour = "ERREUR : " + ErreurInfo() RETOUR FIN
-- ----------------------------------- |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 512 mensajes |
|
| Publicado el 13,abril 2012 - 16:27 |
Bonjour Rémy,
As-tu essayé d'utiliser la fonction HTTPRequête() avec le type de message httpPut ? Si ça se trouve, cette fonction supporte la méthode PUT, et d'ailleurs c'est comme ça qu'il faudrait faire... Pourquoi passer par un formulaire ???
A défaut, je ne sais pas comment fonctionne HTTPEnvoieFormulaire() avec la méthode PUT, et franchement ça me semble bizarre d'avoir associé "méthode PUT" + formulaire...
En effet, la méthode PUT ne connaît pas la notion de "paramètre" : il y seulement un corps de message qui est transmis.
Et HTTPEnvoieFormulaire() nécessite de renseigner au moins 1 paramètre.
Néanmoins, c'est peut être correctement codé les développeurs PC SOFT, même si l'aide en ligne est muette à ce sujet. :-\
Dans tes tests avec HTTPEnvoieFormulaire(), je te conseille d'utiliser HTTPAjouteParamètre() pour passer ton XML via un paramètre et d'éviter HTTPAjouteFichier().
En tout cas, donne un nom au paramètre (ne laisse pas une chaîne vide). Si les développeurs de PC SOFT ont bien fait leur travail, alors le corps de message de la requête PUT ne devrait pas contenir le nom de ce paramètre, mais seulement la valeur de ce paramètre.
Autre chose: fais bien attention au jeu de caractères.
Par exemple, si le XML est encodé en UTF-8, alors tu dois renseigner le type de contenu (via l'argument <Type du formulaire>) avec:
text/xml; charset="utf-8"
Pour le type de contenu, tu dois te reporter à la norme “RFC 3023 - XML Media Types”.
Si tu spécifies le type de contenu MIME "text/xml", alors le jeu de caractères est spécifié à ce niveau là, et il est nécessaire que le XML soit effectivement encodé comme spécifié.
------------------------- Pour UTF-8;
Content-type: text/xml; charset="utf-8"
------------------------- Pour UTF-16, spécifier le jeu de caractère ne suffit pas, et il faut en plus déterminer l'ordre des octets (byte order), donc:
Content-type: text/xml; charset="utf-16"
et le texte XML doit être précédé du "Byte Order Mark".
------------------------- Dans le WLangage, le type chaîne UNICODE correspond à "UTF-16le". La norme prévoit ce jeu de caractères et du coup il ne faut plus donner le "Byte Order Mark":
Content-type: text/xml; charset="utf-16le"
------------------------- Si tu ne précises pas le jeu de caractères, comme ceci:
Content-type: text/xml"
alors la norme suppose celà:
Content-type: text/xml; charset="us-ascii"
-------------------------
Tu peux aussi utiliser le type de contenu "application/xml", et je te suggère de lire la norme: “RFC 3023 - XML Media Types” » http://tools.ietf.org/html/rfc3023
-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/… |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 512 mensajes |
|
| Publicado el 13,abril 2012 - 16:47 |
Rémy, bravo pour ton opiniâtreté, et merci pour ton retour d'information.
Alors apparemment, le nom du paramètre peut être une chaîne vide. Que se passe-t-il si tu donnes un nom au paramètre ?
En lisant l'aide en ligne pour HTTPRequête(), j'ai bien vu qu'il n'est pas possible de préciser le type de requête, donc c'est inutilisable en l'état ! :-\ (mais franchement, je ne vois pas quelle est la pertinence de HTTPEnvoieFormulaire() sauf peut être si on veut envoyer un fichier et éviter fChargeTexte()).
Je pense que ça pourrait être utile d'ajouter une annotation dans l'aide en ligne car ce sujet intéresse de nombreux développeurs.
Rémy a écrit dans le message de news <531e46d9868b9cfa7571a897757005c3@news.pcsoft> :
Après des heures et des heures je viens de trouver... Le content-type du formulaire ne convenait pas, par conséquent le moteur PHP interprétait les balises ouvrantes XML < comme du texte url encodé %3C. Il faut donc mettre comme content-type ou <type du formulaire> dans la fonction httpEnvoieFormulaire (6ème paramètre) : text/xml La bonne synthaxe est donc : HTTPAjouteParamètre( "FORM", "", l_sTexte ) SI HTTPEnvoieFormulaire( "FORM", l_sMonSiteUrl, httpPut, "", "", "text/xml", l_APIKey, "" ) ALORS SAI_retour = "Envoi formulaire OK" SAI_response = HTTPDonneRésultat() SINON SAI_retour = "ERREUR : " + ErreurInfo() RETOUR FIN -- -----------------------------------
P.S. syntaxe sans "H" 
-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/… |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 512 mensajes |
|
| Publicado el 13,abril 2012 - 16:55 |
Lu quelque part sur l'internet:
« X-HTTP-Method-Override is a non-standard HTTP header. It is designed for clients that cannot send certain HTTP request types, such as PUT or DELETE. Instead, the client can send an HTTP POST and set the X-HTTP-Method-Override header to the desired method. »
Cet en-tête permet d'envoyer au webservice une requête POST et de lui demander de la traiter comme une requête PUT.
C'est en usage chez Google, par exemple.
C'est bien pratique quand on n'arrive pas à envoyer directement une requête PUT comme c'est le cas pour la fonction HTTPRequête() !
(mais à quoi pensent les développeurs de PC SOFT ?!)
Rémy a écrit dans le message de news <1f28f73f9a099e189e298d068da23b90@news.pcsoft> :
Je n'arrive toujours pas a envoyer ma méthode PUT convenablement  Je viens d'essayer ça : SI HTTPRequête(l_sMonSiteUrl, "" , "X-HTTP-Method-Override: PUT", l_sTexte, "", l_APIKey, "" ) ALORS SAI_response = HTTPDonneRésultat() SAI_response += RC + RC + HTTPDonneRésultat(httpEntête) SINON SAI_response = "ERREUR : " + ErreurInfo() FIN Mais ne fonction toujours pas  Des idées ? -- -----------------------------------
-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/… |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 48 mensajes |
|
| Publicado el 13,abril 2012 - 18:24 |
Je viens de lire toutes tes réponses et te remercie beaucoup pour le temps qui tu as passé a m'aider.
J'ai dû fouiller presque toutes les informations sur le net depuis hier et en suis venu à aller voir comment faisait node.js.. c'est pour dire mon désespoir 
Pour te répondre :
Quand on passe un paramètre avec un nom via HTTPAjouteParamètre()
exemple : HTTPAjouteParamètre( "FORM", "File", l_sTexte )
Cela me génère une erreur côté webservice.
Donc apparemment quand on ne passe pas de nom de paramètre il doit envoyer le contenu dans le corps de la requête HTTP. Je n'ai pas essayé avec HTTPAjouteFichier... je vais tenter pour voir mais pas garantie de réussir 
HTTPRequête() ne gère en effet pas les méthodes Http PUT, DELETE et sûrement TRACE.
J'ai même essayé d'ouvrir une socket sur mon serveur web et écrite la requête HTTP à la main (mais je n'ai pas réussi)... Au cas ou, je laisse le code en bas de message si ça intéresse qqun un jour (il est buggé mais constitue un bon début).
Je pense que PCSoft s'est surtout axé sur le développement webservice en SOAP, du coup ils ont mis de côté la doc et les fonctions pour le REST par exemple...
J'avais vu que pour l'API de google calendar Google préconise l'utilisation de X-HTTP-Method-Override: PUT, mais ça n'avait pas l'air de marcher chez moi... il fallait peut-être modifier une conf de apache ??? (dav_module ?)...
Bref, j'espère que ça servira à qqun car bien galère 
Merci à toi pour tes réponses.
------------------------------------------------ Code ouverture socket pour communication http (buggé)
l_sEnteteHttp est une chaîne = [ PUT /www/API/customers/3 HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Cookie: xxxxxxxxxxxxxxxxxxxxxxxxxxx (à remplacer par votre valeur) Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxx (à remplacer par votre valeur) Cache-Control: Max-Age=0 ]
SI SocketConnecte("maSocket", 80, "127.0.0.1" )=Faux ALORS Erreur("erreur de connexion " + ErreurInfo(errMessage)) RETOUR SINON Info("ok") FIN
SI PAS SocketChangeModeTransmission("maSocket",SocketSansMarqueurFin) ALORS Erreur("Erreur de changement de mode de la socket") RETOUR FIN
SI PAS SocketEcrit("maSocket",l_sEnteteHttp) ALORS Info("Erreur d'écriture sur la socket") RETOUR FIN
SAI_response = SocketLit("maSocket", Faux)
SocketFerme("maSocket")
-- ----------------------------------- |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 223 mensajes |
|
| Publicado el 14,abril 2012 - 18:43 |
Salut Remy.
Tu es donc aussi sur le CRUD de Prestashop.
De mon coté j'ai pratiquement fini l'ensemble de mes classes WD de synchronisation.
Il te faudra contourner de nombreux problème de jeunesse du WS de PS si tu ne veux pas intervenir dans le framework de PS.
J'ai déjà ouvert quelques requêtes dans le bugtracker de PS.
Bien qu'ayant déjà quelques méthode en preprod je découvre encore régulièrement des comportements inattendus du Webservice.
Sache aussi que selon le type d'information le WS ne respecte pas forcement les instructions données lors des appels de syntaxe (le fonctionnement n'est donc pas aussi idyllique que la doc le fait paraitre).
Le cas des éléments customers est celui de l'exemple fournit dans la doc, et l'un des seul qui ... marche tout seul. Sa mise en oeuvre est assez facile.
Par contre, dans les autres cas on se heurte assez régulièrement a des rubriques obligatoires, qui en fait ne le sont pas mais aussi l'inverse (ce qui est plus gênant).
Bref, pas besoin de perdre du temps à développer une méthode contrôlant la présence des rubriques obligatoire, cela ne sert à rien.
Il y a aussi le cas des rubriques des fois interdites, des fois paradoxalement obligatoires, ce qui n'est mentionné nulle part (par exemple le cas de link_rewrite), mais tu a probablement vu mon info sur la forge de PS.
Il y a aussi le retour lors du download d'images qui ne donne pas les informations nécessaires (là aussi j'ai fait des suggestions sur la forge de PS).
J’espère que PS1.5 perfectionnera un peu le WS (rien de neuf dans la 1.4.3 qui vient de sortir).
Le plus simple (ca été ma méthode de travail) étant me "mettre les mains dans le cambouis" pour comprendre les réaction de PS (donc coté php).
Bon dev. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 48 mensajes |
|
| Publicado el 14,abril 2012 - 19:34 |
Hello Roland,
tout d'abord merci beaucoup pour ta réponse. Je viens de perdre environ 2 jours pleins à essayer justement de voir ce qui était nécessaire ou pas. Je me suis cassé les dents car, comme tu le soulignes, il n'y a en effet que les cutomers qui fonctionnent correctement... grrrrr 
La je viens de terminer le CRUD des catégories et je vais attaquer les produits et marques...
Ma démarche est la même que la tienne, je mets les mains dans le cambouis Avec poster, le plugin firefox ça facile grandement les choses. si tu ne connais pas va jeter un oeil : https://addons.mozilla.org/en-US/firefox/addon/poster/
Si ce n'est pas abusé de te demander, aurais-tu un fichier xml vide ou template pour l'ajout et modif des produits et marques ? Ca m'aiderait à aller un peu plus vite plutôt que de tester en enlevant paramètre par paramère Je suis à la bourre dans mon projet et je compte les jours 
J'ai une petite question également sur les images des produits. Comment les envoies-t-on ? Comment également les resizer automatiquement via le webservice ????
Je vais limiter les questions car sinon j'en aurait 10.000 
Merci par avance pour ton partage d'informations !
roland a écrit dans le message de news <2f7b2c7c253a0d204ef03ef1b85b73c8@news.pcsoft> :
Salut Remy.
Tu es donc aussi sur le CRUD de Prestashop.
De mon coté j'ai pratiquement fini l'ensemble de mes classes WD de synchronisation.
Il te faudra contourner de nombreux problème de jeunesse du WS de PS si tu ne veux pas intervenir dans le framework de PS.
J'ai déjà ouvert quelques requêtes dans le bugtracker de PS.
Bien qu'ayant déjà quelques méthode en preprod je découvre encore régulièrement des comportements inattendus du Webservice.
Sache aussi que selon le type d'information le WS ne respecte pas forcement les instructions données lors des appels de syntaxe (le fonctionnement n'est donc pas aussi idyllique que la doc le fait paraitre).
Le cas des éléments customers est celui de l'exemple fournit dans la doc, et l'un des seul qui ... marche tout seul. Sa mise en oeuvre est assez facile.
Par contre, dans les autres cas on se heurte assez régulièrement a des rubriques obligatoires, qui en fait ne le sont pas mais aussi l'inverse (ce qui est plus gênant).
Bref, pas besoin de perdre du temps à développer une méthode contrôlant la présence des rubriques obligatoire, cela ne sert à rien.
Il y a aussi le cas des rubriques des fois interdites, des fois paradoxalement obligatoires, ce qui n'est mentionné nulle part (par exemple le cas de link_rewrite), mais tu a probablement vu mon info sur la forge de PS.
Il y a aussi le retour lors du download d'images qui ne donne pas les informations nécessaires (là aussi j'ai fait des suggestions sur la forge de PS).
J’espère que PS1.5 perfectionnera un peu le WS (rien de neuf dans la 1.4.3 qui vient de sortir).
Le plus simple (ca été ma méthode de travail) étant me "mettre les mains dans le cambouis" pour comprendre les réaction de PS (donc coté php).
Bon dev.
-- ----------------------------------- |
| |
| |
| | | |
|
| | |
| |
| Publicado el 03,septiembre 2012 - 23:30 |
| Oui et y'a t'il une solution ? Car avec le override ça bloque et finit toujours en timeout... Je suis vraiment preneur, car ne pas pouvoir faire de PUT/DELETE avec httprequete c'est plus que manquant, PCSOFT devrait améliorer cela rapidement. |
| |
| |
| | | |
|
| | |
| |
| Publicado el 05,diciembre 2012 - 18:12 |
Bonjour,
Tout d'abord Rémy, merci pour le petit bout de code PUT qui m'a bien dépanné  Toujours sous Prestashop, je rencontre quelques difficultés pour le Create (Ajouter) un Client (ressource Customers). Mes procédures de Sélection, Modification et Suppression fonctionnent toutes bien en CRUD mais je n'arrive pas à Ajouter (malgré mes recherches infructueuse) mes clients.
Quelqu'un pour me venir en aide ? 
Merci ! |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 48 mensajes |
|
| Publicado el 05,diciembre 2012 - 20:00 |
Hello,
ça dépasse un peu WD mais en gros, en activant les erreurs sous PS (dans le fichier de conf), tu as toutes les informations nécessaires dans le XML d'erreur pour avancer (c'est assez verbeux pour s'en sortir). Si tu as des questions spécifiques : remyvann arobase hotmail point fr |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1 mensaje |
|
| Publicado el 15,abril 2013 - 01:03 |
Bonjour,
Novice avec Windev, je viens d'avoir l'idée de développer un petit interface pour prestashop, pour faciliter la mise à jour d''une boutique.
Autant novice en windev, j'ai pas tout à fait compris les bout de codes sur le post, donc je m'adresse à vous, pour me guider (dès le début ^^) ou avec un petit exemple avec la connexion à prestashop.
Merci d'avance. |
| |
| |
| | | |
|
| | |
| |
| Publicado el 11,diciembre 2015 - 12:12 |
Bonjour à tous,
Je suis confrontée au même problème que Rémy, à savoir que je rencontre une erreur lorsque je veux faire une modification en utilisant PUT du protocole Http. Tout fonctionne parfaitement en GET et en DELETE, mais cela ne marche pas en PUT (ni en POST).
J'ai repris le code indiqué dans ce post, mais j'ai systématiquement la même erreur que Rémy : <errors> <error> <message><![CDATA[Internal error. To see this error please display the PHP errors.]]></message> </error> <errors>
La seule différence quand je fais un PUT ou un POST est qu'il faut renvoyer un xml au site web après l'avoir modifié dans mon projet. C'est donc probablement là que se situe mon problème mais je ne trouve pas la solution. Je suis passée par un export de mon xml sur le disque afin de pouvoir ensuite le charger dans une variable chaîne car je ne pouvais pas effectuer une affectation directe dans une chaine de mon xmldocument...
Voici mon code :
URL est une chaîne monXml est un XMLDocument NomFichierArticles = ComplèteRep(fRepWeb()) + "Article.xml"
URL = "http://MACLE@monsiteweb.com/api/products/1" monXml = XMLOuvre(URL,depuisURL)
POUR TOUT NoeudPrestashop DE monXml..NoeudRacine POUR TOUT NoeudProduct DE NoeudPrestashop NoeudProduct.price = "15.99" SORTIR FIN SORTIR FIN
XMLSauve(monXml,NomFichierArticles,XMLDocumentDéfaut) SI ErreurDétectée = Vrai ALORS Erreur(ErreurInfo(errComplet)) RETOUR FIN
MonURL est une chaîne = "http://monsiteweb.com/api/products/1" MaCle est une chaîne = "MACLE"
Texte est une chaîne = fChargeTexte(NomFichierArticles)
HTTPCréeFormulaire("FORM")
HTTPAjouteParamètre("FORM","",Texte)
SI HTTPEnvoieFormulaire("FORM",MonURL,httpPut,"","","text/xml",MaCle,"") ALORS Texte = HTTPDonneRésultat() Info("Message récupéré : " + Texte) SINON Erreur(ErreurInfo()) RETOUR FIN
Merci pour votre aide.
Cordialement,
Delphine |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 69 mensajes |
|
| Publicado el 27,marzo 2020 - 18:34 |
Je déterre un peu le projet. Je suis moi-même en train de faire un passerelle de windev vers prestashop. Je bute un peu sur l'ajout des images à un produit. Je suis obligé de passer par HTTPAjouteFichier avec un fichier image en paramètre. Je cherche comme le faire directement à partir du buffer image (car l'image est stockée en BDD) avec HTTPAjouteParamètre. Quelqu'un a réussi ça ? Ou est-on obligé de copier le fichier image sur l'ordi ? |
| |
| |
| | | |
|
| | | | |
| | |
|