Conversion requête PHP en .JS pour SOAP Webservice


#1

Bonjour à tous !

Je dois communiquer avec un webservice fonctionnant via le protocole SOAP.
Je dispose d’un exemple de code (ci dessous) pour communiquer avec ce webservice, or celui-ci est en PHP. Quelqu’un saurait m’aider à transformer ce bout de PHP en .JS pour accéder aux données XML mises à disposition par ce webservice ?

un grand merci d’avance !


#2

A mon avis SOAP et JS ensemble c’est pas une bonne idée. Pourquoi pas le faire en PHP justement ?
En plus l’échange de données sera côté serveur, donc pas de pbm de sécurité.
Le mieux c’est de “proxifier” ton appel pour simplifier la manoeuvre.

Pour faire simple, ce qu tu fais :

  1. Côté PHP, tu crée une API web avec un endpoint (route + controller + brique SOAP).
  2. Ce endpoint fait l’appel SOAP ci-dessus, recupère la réponse XML,
  3. Puis tu adaptes le message de sortie du endpoint en fonction de ce que attend le JS :
  • soit renvoyer le message XML d’origine tel quel (à éviter, c’est lourd, peut contenir des data sensibles)
  • soit renvoyer une version XML synthétisée du message XML d’origine et adapté pour ce que tu vas en faire côté JS
  • soit renvoyer une version JSON syntéthisée (car le XML c’est plus lourd et moins performant à parser que du JSON)
  1. Coté JS tu fais un appel Ajax classique vers ce endpoint et reçoit la réponse JSON (ou XML selon ta préférence)

#3

Hello @Joris,

merci pour ta réponse. En effet ce que tu indiques me semble idéal. Malheureusement mes connaissances sont encore un peu limitées pour réaliser les points 1 et 2 :

J’utilise un service tiers dans lequel je fais mes appels en js (‘pur js’ ou vanilla js car ce service n’accepte rien d’autre…). Sais-tu s’il existe des applications toutes faites avec API permettant de "proxifier"les appels vers des webservices soap pour en extraire juste les xml (ou mieux encore de renvoyer du json) ?

merci bcp


#4

Bonjour @fdolin.

Il me semble qu’au vu de ce que te propose @Joris et la suite de ta question, ce post n’est pas (plus) à sa place dans JavaScript.

Il me semble qu’il y a un tag PHP. Je t’encourage à déplacer ta demande pour avoir plus d’aide spécifique sur celle-ci (et éventuellement à revoir le titre et p-e ajouté un « EDIT » sur la question principale.

J’espère que tu trouveras chaussure à ton pied.


#5

@Haeresis
Oui ma proposition se focalise essentiellement sur PHP.

@fdolin

Le “proxifiage” concerne surtourt la partie PHP.
Côté JS, un simple appel standard Ajax suffit.

En vanillaJS : ya

Le point 2 tu l’as deja dans ton exemple ci-dessus.

Le point 3
tu l’as deja aussi puisque tu enregistre la réponse XML dans un fichier.
Par déduction, si derrière c’est to JS qui veut récupérer le contenu du XML,
tu n’a aucun intéret a enregistrer le XML dans un fichier (ici Results.xml).
Tu le renvoie “dans la foulée”. Par cela je mexplique :

Tu vas charger le XML sous forme d’un objet XML manipulable.

avec simple_xml_load_string

ex:
$responseXML = $sClient->ActionGetStockBartByEcom($param);
if ($response){
$oResponseArray = @json_decode(@json_encode($oResponseXML),1)

Ensuite pour extraire les données et produire ton propre JSON,

  • $oResponseArray contient une version “tableau” du XML d’origine. Plus facile a manipuler, traverser, extraire.

tu peux construire un tableau a l’image de ce que tu voudrais renvoyer en JSON.
Pour chaque element de tableau, tu extrais et fais correspondre les données issues de l’objet $oResponse.

Une fois que ton tableau est fait, tu le renvoie sous format JSON avec : json_encode(tableau);
et le header application/json qui va bien. Enfin sauf si tu utilise un micro framework qui fait le boulot pour toi.
Après t’as plus qu’a faire l’appel Ajax en JS et hop tu recois le JSON sous forme d’un objet…JSON
et t’en fais ce que tu veux.

Le point 1 :
Dans le monde PHP, tu peux utiliser un micro-framework pour monter une API web facilement :
Slim : https://www.slimframework.com/
Lumen (basé sur Laravel) : https://lumen.laravel.com/

C’est notamment lui qui va faciliter l’envoi de la réponse JSON bien formatée (avec les bons, headers, encodage, etc…)


#6

Bonjour,

Merci pour la réponse. Malheureusement le point 1 est encore bien au dessus de mes capacités;
je suis en train de regarder du côté de cette solution, qui permet a priori de “proxifier” un webservice SOAP :
https://apigee.com , cf détails ici : http://docs.apigee.com/tutorials/proxy-soap-service

je parviens bien à avoir un “wsdl” valide, mais ne vois pas ou renseigner les éléments du $param que je dois indiquer pour m’authentifier :

une idée de ce que je devrais renseigner pour cela ici par rapport aux éléments $param détaillés auparavant ?

merci beaucoup !


#7

Ouais t’as bien fait de choisir une solution Cloud avec Apigee, si tu te sens pas de le coder 😉
La tu as choisi une authentification OAUTH. C’est pas le bon je pense. Essaie avec “API Key”.
Quand aux arguments, soit dans l’onglet “détails” soit dans l’onglet “wsdl”, mais ya pas les captures.


#8

Voici les différentes étapes lorsque je complète les onglets :


#9


#10


#11


#12


#13

ce qui est étrange je trouve cest que lorsque je coche le radiobutton de Api Key ou les cases “Impose Quota per developer” ou “Publish API Product”, a aucun moment il ne m’est demandé de saisir des arguments. Les seuls champs ‘éditables’ sont ceux de l’étape “Détails” …
une idée de ce qu’il faudrait faire ?
merci bcp