254 votes

Exemple SOAP le plus simple

Quel est le plus simple exemple de SOAP en utilisant Javascript?

Pour être aussi utile que possible, la réponse devrait:

  • Être fonctionnelle (en d'autres termes, fonctionner réellement)
  • Envoyer au moins un paramètre pouvant être défini ailleurs dans le code
  • Traiter au moins une valeur de résultat pouvant être lue ailleurs dans le code
  • Fonctionner avec la plupart des versions de navigateurs modernes
  • Être aussi claire et aussi courte que possible, sans utiliser de bibliothèque externe

5 votes

Être simple et clair peut entrer en conflit avec le fait de ne pas utiliser de bibliothèque externe. Voulez-vous vraiment écrire votre propre convertisseur de classe WSDL -> JS ?

19 votes

J'ai une question : si je voyais cette question en tant que première personne, je m'attendrais à ce qu'elle soit descendue avec des commentaires du genre "montre un peu de code, ce n'est pas 'louer un codeur'". Rien de personnel, Thomas :) Mais je ne comprends pas comment la communauté décide de ce qui est bon et mauvais.

4 votes

Bonjour pas de soucis. Je suppose que le point de la question est qu'il y a plusieurs façons d'écrire un client SOAP en utilisant JavaScript. Beaucoup d'entre elles sont laides, donc j'espérais avoir quelques idées pour le garder propre.

213voto

user1039677 Points 641

Ceci est le client SOAP JavaScript le plus simple que je puisse créer.

    Test du client JavaScript SOAP

        function soap() {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'https://somesoapurl.com/', true);

            // construire la requête SOAP
            var sr =
                '<?xml version="1.0" encoding="utf-8"?>' +
                '<soapenv:Envelope ' + 
                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
                    'xmlns:api="http://127.0.0.1/Integrics/Enswitch/API" ' +
                    'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
                    'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '<soapenv:Body>' +
                        '<api:some_api_call soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' +
                            '<username xsi:type="xsd:string">login_username</username>' +
                            '<password xsi:type="xsd:string">password</password>' +
                        '</api:some_api_call>' +
                    '</soapenv:Body>' +
                '</soapenv:Envelope>';

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) {
                    if (xmlhttp.status == 200) {
                        alert(xmlhttp.responseText);
                        // alert('done. use firebug/console to see network response');
                    }
                }
            }
            // Envoyer la requête POST
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
            xmlhttp.send(sr);
            // envoyer la requête
            // ...
        }

2 votes

Que diriez-vous d'envoyer un ? J'ai essayé d'inclure mes balises d'en-tête dans la variable sr, cependant le serveur a reçu un soapenv:Header vide.

1 votes

Cela a fonctionné pour moi! (après avoir remplacé l'URL du service SOAP par une réelle et désactivé les restrictions de domaine croisé sur mon navigateur, comme indiqué par @Prestaul)

0 votes

Je développe une application multiplateforme en nativescript pour android/ios. Je veux utiliser des services web SOAP. Merci de me guider pour cela. J'ai utilisé le code ci-dessus pour la requête SOAP & je veux le format de réponse SOAP, comment gérer la réponse. Veuillez consulter ma question - stackoverflow.com/questions/37745840/…

81voto

Chris Stuart Points 561

Il y a de nombreuses bizarreries dans la façon dont les navigateurs traitent XMLHttpRequest, ce code JS fonctionnera sur tous les navigateurs :
https://github.com/ilinsky/xmlhttprequest

Ce code JS convertit le XML en objets JavaScript faciles à utiliser :
http://www.terracoder.com/index.php/xml-objectifier

Le code JS ci-dessus peut être inclus dans la page pour répondre à votre exigence de ne pas utiliser de bibliothèque externe.

var symbol = "MSFT"; 
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://www.webservicex.net/stockquote.asmx?op=GetQuote",true);
xmlhttp.onreadystatechange=function() {
 if (xmlhttp.readyState == 4) {
  alert(xmlhttp.responseText);
  // http://www.terracoder.com convertir le XML en JSON 
  var json = XMLObjectifier.xmlToJSON(xmlhttp.responseXML);
  var result = json.Body[0].GetQuoteResponse[0].GetQuoteResult[0].Text;
  // Le texte du résultat est une chaîne XML échappée, convertir la chaîne en objet XML puis convertir en objet JSON
  json = XMLObjectifier.xmlToJSON(XMLObjectifier.textToXML(result));
  alert(symbol + ' Stock Quote: $' + json.Stock[0].Last[0].Text); 
 }
}
xmlhttp.setRequestHeader("SOAPAction", "http://www.webserviceX.NET/GetQuote");
xmlhttp.setRequestHeader("Content-Type", "text/xml");
var xml = '' +
 '' + 
   ' ' +
     ' ' +
       '' + symbol + ' ' +
     ' ' +
   ' ' +
 '';
xmlhttp.send(xml);
// ...Inclure le code JS Google et Terracoder ici...

Deux autres options :

0 votes

Que dois-je faire si je veux passer plusieurs enveloppes ?

0 votes

Je suis en train d'utiliser le code ci-dessus, mais xmlhttp.responseText est toujours null. Pouvez-vous me fournir quelques liens pour surmonter l'erreur ?

0 votes

Lien pour quand Google Code est supprimé : github.com/ilinsky/xmlhttprequest

49voto

Prestaul Points 31986

Ceci ne peut pas être fait avec du JavaScript simple à moins que le service web ne soit sur le même domaine que votre page. Edit: En 2008 et dans IE<10 cela ne peut pas être fait avec du javascript simple à moins que le service soit sur le même domaine que votre page.

Si le service web est sur un autre domaine [et que vous devez prendre en charge IE<10] alors vous devrez utiliser une page proxy sur votre propre domaine qui récupérera les résultats et vous les renverra. Si vous n'avez pas besoin de prendre en charge les anciennes versions d'IE, vous devez ajouter le support CORS à votre service. Dans tous les cas, vous devriez utiliser quelque chose comme la librairie que timyates a suggérée car vous ne voulez pas avoir à analyser les résultats vous-même.

Si le service web est sur votre propre domaine alors ne pas utiliser SOAP. Il n'y a aucune bonne raison de le faire. Si le service web est sur votre propre domaine alors modifiez-le pour qu'il puisse renvoyer du JSON et épargnez-vous les problèmes liés à l'utilisation de SOAP.

La réponse courte est : Ne faites pas de requêtes SOAP depuis JavaScript. Utilisez un service web pour demander des données à un autre domaine, et si vous le faites, analysez les résultats côté serveur et renvoyez-les sous une forme adaptée au JavaScript.

1 votes

Le but est que le serveur SOAP serve également une page HTML pour des tests et évaluations simples. Le client serait sur le même domaine. Ne pas utiliser SOAP pour l'interface semble être l'opinion acceptée. Des commentaires à ce sujet? Veuillez ajouter à la nouvelle question : stackoverflow.com/questions/127038

1 votes

Il n'y a pas de point à répondre là-bas... Je suis d'accord avec Gizmo sur les trois points. XML est gonflé et difficile à manipuler avec js tandis que JSON est concis et natif.

10 votes

Re "cannot be done": Aujourd'hui, cela peut être fait avec (principalement) du JavaScript pur, si le client prend en charge Cross-Origin Resource Sharing. Espérons qu'en 3-4 ans, cela sera universellement disponible.

7voto

Richard June Points 511

Thomas:

JSON est préféré pour une utilisation frontale car nous avons des recherches faciles. Par conséquent, vous n'avez pas à vous occuper de XML. SOAP est pénible sans l'utilisation d'une bibliothèque à cause de cela. Quelqu'un a mentionné SOAPClient, qui est une bonne bibliothèque, nous avons commencé avec elle pour notre projet. Cependant, elle présentait certaines limitations et nous avons dû réécrire de grandes parties. Elle a été publiée sous SOAPjs et prend en charge le passage d'objets complexes au serveur, et comprend un exemple de code proxy pour consommer des services à partir d'autres domaines.

2 votes

"JSON est préféré pour une utilisation front-end car il est javascript." - JSON n'est pas JavaScript. (Il ressemble simplement à JavaScript.)

2 votes

fr.wikipedia.org/wiki/JSON -- Signifie littéralement "JavaScript Object Notation", et même si je suis d'accord que JSON est une spécification et non un langage et est donc clairement "pas JavaScript", vous devez admettre que son nom peut facilement tromper les gens.

0 votes

"JSON est préféré pour une utilisation en front end car il s'agit de javascript" Veuillez supprimer ceci, cela diffuse de fausses informations: timelessrepo.com/json-isnt-a-javascript-subset

1voto

Constantin Points 12185

L'exemple le plus simple consisterait en :

  1. Obtenir l'entrée de l'utilisateur.

  2. Composer un message XML SOAP similaire à ceci

          chaîne
  3. Envoyer le message à l'URL du service Web en utilisant XHR

  4. Parser la réponse XML SOAP du service Web similaire à ceci

         ...............
  5. Présenter les résultats à l'utilisateur.

Mais c'est assez compliqué sans l'utilisation de bibliothèques JavaScript externes.

0 votes

Même pas la première partie à laquelle vous n'avez pas répondu - Soyez fonctionnel (en d'autres termes, que cela fonctionne réellement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X