Durchführen von SOAP-Anforderungen mit Node.js

Wenn Sie REST nicht verwenden können

Was ist SOAP?

SOAP steht für Simple Object Access Protocol. Es ist im Grunde das einzige, was vor REST existierte. Es ist eine XML-basierte API. Bevor Sie fortfahren, sollten Sie wissen, dass REST viel, VIEL besser ist.

Ein SOAP-Server besteht aus einer sogenannten WSDL (Web Services Description Language), die ein XML-Schema enthält, um zu definieren, welche Aktionen an den Server gesendet werden können. Denken Sie an die REST-API-Dokumente.

So nutzen Sie einen SOAP-Dienst?

Nach ein oder zwei Stunden im Internet nach einem noch funktionierenden SOAP-Dienst habe ich endlich einen gefunden. Glücklicherweise verfügt NOAA immer noch über funktionsfähige Legacy-Technologien, die SOAP verwenden.

Um auf eine SOAP-API zuzugreifen, müssen Sie eine POST-Anfrage senden, die einige Dinge enthält:

  • Die richtigen Überschriften (normalerweise zwei)
  • Ein SOAP-Umschlag

Überschriften

Für fast alle SOAP-Anforderungen müssen Sie die Daten im XML-Format senden:

Inhaltstyp: Text / XML; Zeichensatz = UTF-8

Ein weiterer Header, den Sie senden müssen, ist die soapAction. Nun benötigen nicht alle Dienste eine soapAction (wenn in der WSDL soapAction = "" angegeben ist). Wenn der SOAP-Dienst jedoch mehrere Funktionen bietet, müssen Sie ihn normalerweise senden. Die Art und Weise, wie Sie die soapAction finden, besteht darin, die WSDL mit "Strg + F" zu markieren oder sich auf API-Dokumente zu verlassen, falls vorhanden. Diese sind meiner Meinung nach schwer zu finden, da SOAP ziemlich veraltet ist. Hier ist die von NOAA bereitgestellte WSDL.

Hier ist ein Beispiel für eine soapAction für die oben genannte WSDL:

soapAction: 'https: //graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl#LatLonListZipCode'

Abschließend benötigen wir mindestens diese beiden Überschriften. Sie können jedoch auch eine dritte hinzufügen, um einigen externen Webdiensten, für die ein Benutzer-Agent erforderlich ist, eine freundliche Note zu verleihen. Zum Beispiel:

User-Agent: "Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit / 535.19 (KHTML, wie Gecko) Chrome / 18.0.1025.151 Safari / 535.19"

SOAP-Umschlag

Als Nächstes müssen Sie eine SOAP-Nutzlast an den Service senden. Dies sind die Daten, die der Service verwenden soll, bevor Sie Ihre Antwort zurückerhalten. Die meisten Entwickler, mit denen ich gearbeitet habe, verwenden ein Tool namens SOAP UI, um ihre Nutzdaten zu generieren.

Wenn Sie eine WSDL (lokale Datei oder HTTP-URL) in die SOAP-Benutzeroberfläche eingeben, werden in der Seitenleistenstruktur "SOAP-Bindungen" und Testfälle (für alle soapActions) generiert. Hierbei handelt es sich um XML-Boilerplate-Schemas, die von Ihrem SOAP-Webdienst verwendet werden. Sie müssen lediglich die Daten eingeben.

Für den NOAA-Dienst habe ich diese WSDL angeschlossen und die Option "Test-Suite für SOAP-Bindungen erstellen" aktiviert, und alle Testfälle wurden für mich gerendert. Ich musste nur das "?" Im Umschlag durch akzeptable Daten ersetzen, um den Dienst in Anspruch zu nehmen.

Video zur Verwendung der SOAP-Benutzeroberfläche

Testen des Dienstes mit Curl

Ich wollte den Service mit etwas ziemlich Minimalem und Rohem testen, um sicherzustellen, dass die SOAP-Benutzeroberfläche nicht vor meinen Augen zaubert, und um zu verstehen, was sich hinter den Kulissen abspielt.

Ich habe den Umschlag für die LatLonListZipCode soapAction aus der SOAP-Benutzeroberfläche kopiert und in eine Datei eingefügt, die zum Einrollen verwendet werden soll (die Eingabe als Zeichenfolge wäre für einen langen Befehl erforderlich gewesen).

Ich habe dann das? Zwischen dem -Tag mit einer gültigen Postleitzahl wurde der folgende Befehl ausgeführt:

Niedrig und siehe da, ich erhielt die folgende Antwort, die mir die korrekten Koordinaten für Breite und Länge gab!

Warum sollte ich Node.Js verwenden, um etwas so Altes wie Seife zu konsumieren?

Wenn Sie so sind wie ich und in einem großen Unternehmen arbeiten, werden Sie wissen, dass ältere Technologien viel zu lange betrieben und gewartet werden. Ich bin eher geneigt, moderne Tools wie Node zu verwenden, um die Arbeit zu erledigen, da ich weniger Code schneller schreiben kann.

Ich wurde beauftragt, Integrationstests für alte SOAP-Dienste in Java zu schreiben. Ich verachte Java. Es gibt einfach zu viel Code, um etwas Einfaches wie eine HTTP-Anfrage zu schreiben. Ich dachte ... ich wette, dass ich das in Node einfach machen kann.

Das Easy-Soap-Request-Knotenmodul

Es gab mehrere beliebte SOAP node.js-Module zur Auswahl, mit denen SOAP-Anforderungen ausgeführt werden können:

  • Seife
  • starke Seife
  • Easy-Soap

Aber ich habe es geschafft, mit allen etwas falsches für meinen speziellen Anwendungsfall zu finden. Jeder benötigte entweder zu viel Code oder zu viel Overhead. Ich dachte mir: "Ich muss nur drei Parameter senden, das ist alles. Warum so umfangreiche Dokumente für alle Module, wenn ich etwas so Einfaches machen möchte. “Also…

Ich habe eine einfache .js-Datei geschrieben, um die oben beschriebene Prozedur mit Axios für die Ausführung einer POST-Anforderung neu zu erstellen, dachte jedoch: "Dies ist immer noch zu viel Code, um etwas so Einfaches zu tun ...". Also habe ich das easy-soap-request-Knotenmodul erstellt.

Das Modul hat nicht viel zu bieten, bietet aber einen „Auftrieb“. Dies spart Zeit für diejenigen, die gerade etwas über die gefürchtete Legacy-SOAP lernen. So sieht das Modul aus:

Das Modul akzeptiert drei Parameter (URL, Header, XML), wobei XML der Seifenumschlag ist.

Es verwendet die neuere asynchrone Wartezeit-Syntax, sodass Sie mit Ihrer asynchronen Codierung und so weiter alles Phantasievolle erreichen können.

Eigentlich mit dem Ding

Node.js Nutzung

Zunächst müssen Sie das Modul installieren, indem Sie Folgendes ausführen:

npm installiere easy-soap-request

Als nächstes müssen Sie eine .js-Datei erstellen und das Modul wie in Zeile 1 unten anfordern.

Hier ist ein gutes Beispiel:

In Zeile 11 habe ich die XML-Datei aus einer Datei eingelesen, da dies eine sehr lange Zeichenfolge wäre, aber die Präferenz liegt bei Ihnen.

In Zeile 15 können Sie sehen, wo ich ein "destrukturiertes" Objekt erstellt habe, indem Sie darauf warten, dass die soapRequest-Funktion sowohl den Hauptteil der Antwort als auch den Statuscode zurückgibt.

Browserverwendung (neu)

Ich habe mir sogar die Mühe gemacht, Webpack zu lernen, damit Sie die easy-soap-Anfrage auf der Client-Seite verwenden können:

Aber denken Sie daran, CORS kann manchmal ein Problem sein.

Hier findest du das Repo mit README und das Modul auf npm.

Testen mit Mokka und Chai

So können Sie dasselbe wie oben ausführen, jedoch innerhalb eines Test-Frameworks:

Flosse

Vielen Dank fürs Lesen und hoffentlich können Sie in naher Zukunft zu REST übergehen!