Cross-domain SOAP call from javascript

Liebe/-r Experte/-in,

ich habe es versucht, mit jQuery eine SOAP-Webservice (SOAP = request und response erfolgen im XML Format!) mittels AJAX POST aus einer anderen Domain aufzurufen.

Die von jQuery angebotene crossDomain jsonp ajax Aufruf kann nicht verwendet werden, da die SOAP Schnittstelle XML im POST Aufruf erwartet.
Auch Yahoo YQL ist nicht verwendbar, da json erwartet.

Welche clientseitige Technologie kann ich verwenden, um eine cross-domain SOAP WebService mittels POST aufzurufen?

Sollte es keine andere Möglichkeit geben:
gibt es evtl. eine Flash-Datei, die ich aus JavaScript aufrufen könnte, um den SOAP aufruf zu erledigen, wie z.B.
var sXmlResponse = swf.post(sSoapUrl, sXmlSoapRequest);
Gibt es solche Flash-Skripte irgendwo?

Für einene Hinweis wäre ich dankbar:
Ilona
[email protected]

Hallo Ilona,

das geht auch direkt mit JavaScript.

Beispiele z.B. hier:
http://www.bennyn.de/programmierung/javascript/http-…

Viele Grüße,

Thorsten

Was du machen willst, ist Userdaten an eine andere Domain schicken. Vom Client aus. Das darf nicht gehen, by design. Egal welche Technologie. Flash ist auch nichts anderes als JavaScript.

Wenn du einen bestehenden Webservice nutzen möchtest, dann mache das Server-seitig.

Mit etwas mehr Infos kämen vielleicht noch andere Ideen.

Bitte beachten, dass ich Antworten von allfällig anderen angefragten Experten nicht sehen kann.

Hallo Ilona,

da kann ich dir leider nicht helfen, da ich mich mit SOAP nicht auskenne. Ich hatte vor einiger Zeit ein Javascript-Cross-Domain-Problem, das ich durch eine PHP-Datei mit fget() gelöst habe. Ich weiß aber nicht, ob das auf SOAP zutrifft.

Freundliche Grüße,

Paul L

Hallo Ilona,

Wenn dir ein Cross-Domain-AJAX-Aufruf gelänge, hättests Du eine Sicherheitslücke gefunden, die sofort gestopft werden müsste. Es spricht im Grunde überhaupt nichts dagegen dies serverseitig zu erledigen, d.h. auf deinem Server liegt ein Script, dass den SOAP-Service aufruft und das Ergebnis an den Client weiterleitet (YQL find ich etwas obskur, aber im Grunde passiert da auch nichts anderes). Wenn Du Kontrolle über den SOAP-Service hast könntest Du ihn auch so umbauen, dass er über Sockets erreichbar ist. Soweit ich weiss können WebSockets jeden beliebigen Server ansprechen. http://socket.io/ leistet hier gute Dienste, auch wenn man serverseitig nicht node.JS einsetzt (s. „In Other Languages“ hier: https://github.com/learnboost/socket.io/wiki/). Das schlägt aber wieder fehl, wenn Socket.IO auf Long Polling zurückfällt, was ja echte Sockets nur simuliert. Man kann der Webseite aber Flash mitgeben, so dass man erst ein Problem hat, wenn clientseitig Flash UND WebSockets fehlen. Ich würde mir das Ganze aber sparen. Ein serverseitiges Script hilft viel schneller und ist browserunabhängig.

Viele Grüße,
Stefan

Hi Ilona,

probier doch mal folgendes aus:

var soapUrl = 'http://some\_soap\_service',  
 soapMessage = '';  
  
$.ajax({  
 url: soapUrl,  
 type: "POST",  
 dataType: "xml",  
 data: soapMessage,  
 complete: function(xmlHttpRequest, status) {  
 console.log("complete", xmlHttpRequest.responseXML);  
 },  
 success: function(xmlHttpRequest, status) {  
 console.log("success", xmlHttpRequest.responseXML);  
 },  
 crossDomain: true,  
 headers: {  
 "X-Requested-With": "XMLHttpRequest"  
 },  
 contentType: 'text/xml; charset="utf-8"'  
});  

Habe zwar bisher mit AJAX keine SOAP requests verarbeitet, aber das Beispiel von oben sollte funtionieren.

Die Variable „soapMessage“ enthält dann den SOAP Request als String (im XML Format).

Als Beispiel sind 2 Callbacks („success“ und „complete“), aber „success“ sollte ausreichen.

In der Regel muss man da auch noch „X-Requested-With: XMLHttpRequest“ als Request-Header mitgeben, ohne wird es vermutlich nicht funktionieren.

Wünsche dir viel Erfolg dabei…

Murat

Hi Murat,
DANKE!
Ich habe den Code ausprobiert, hat aber leider nicht funktioniert.

  1. Den Aufruf habe ich mit Error-Handler erweitert:
error: function(xhr,statusmsg,err)  
{ alert("status:"+statusmsg+"\nerror:"+err);  
},  

Die alert-Ausgabe ist leider nicht vielsagend:
status=error
err=[leer]

  1. In der Firefox Fehlerkonsole steht nichts.

  2. Ein Aufruf des PrivilegeManager (im Firefox) hat auch nicht weiter geholfen
    (netscape.security.PrivilegeManager.enablePrivilege(‚UniversalBrowserRead UniversalBrowserWrite UniversalXPConnect UniversalBrowserAccess UniversalFileRead UniversalFileAccess UniversalPreferencesRead UniversalPreferencesWrite‘):wink:

  3. ein plugin, das das evtl. leisten könnte:
    http://archive.plugins.jquery.com/project/xdajax
    hat nur ein broken download link :frowning:

…so langsam gehen mir die Ideen aus, wie man cross domain SOAP mit js aufrufen könnte.
Flash für SOAP Aufrufe habe ich auch nicht gefunden.

Hast Du vielleicht noch eine Idee?

Unterstützt der Server, auf dem der SOAP Service läuft, auch Cross-Domain-Requests?

Ich meine, bevor der Browser einen solchen Request abschickt, sendet es vorher einen OPTIONS Request, auf die der Server dann mit Access-Control-Allow-* Headern antwortet.

Access-Control-Allow-Credentials: true  
Access-Control-Allow-Headers: Origin, X-Requested-With, Date  
Access-Control-Allow-Origin: \*  

Dabei wird zwischen Client und Server geprüft, ob ein Cross-Domain-Request erlaubt ist.

Ohne die korrekte Antwort vom Server auf den OPTIONS Request des Browsers, wird der eigentliche Request nicht abgesendet.

Versuche doch mal herauszufinden, was da genau an Request/Response stattfindet, z.B. im Firebug unter Netzwerk.
Vielleicht kannst du das auch mit dem Fiddler Web Debugger prüfen.

Sollte der Server dies nicht unterstützen, musst du mit einem Proxy arbeiten.

unfortunately, I have no access to the server, so I’m not able to change the response to the OPTIONS request…

Ok, dann geht das wohl nur über ein Proxy.

Folgender Artikel sollte dir da weiter helfen:
http://jquery-howto.blogspot.com/2009/04/cross-domai…

Im Grunde brauchst du auf dem Server (Domain), der auch die Webseite ausliefet, ein Script, das die Anfrage an den SOAP Service weiterleitet und dessen Ergenis wieder ausgibt.

Hier gibt es auch ein Beispiel dazu:
http://www.webresourcesdepot.com/cross-domain-javasc…

Hallo Ilona,
jquery scheint tatsächlich keine direkte SOAP Unterstützung zu bieten. Ich denke aber, du müsstest auch die jquery.ajax() Methode benutzen können - allerdings muss dann als ‚data‘ ein fertiges Soap-XML-Dokument (String) reingefüttert werden. In der Doku
http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings
suche mal nach
„Example: Send an xml document as data to the server“
Wenn du in den ajax-Params
processData: false
definierst, sollte es klappen… aber du suchst wahrscheinlich nach einem mehr oder weniger fertigen Client zum Einbinden in deine Skripte, der sich simpel mit einen Array, Objekt oder Formular füttern lässt?
Da kann ich dir leider nicht direkt helfen, aber die Suchergebnisse von „jquery soap client“ bzw. „javascript soap client“ sehen nicht ganz nutzlos aus.

Noch eine andere Möglichkeit:
Ein „normaler“ ajax-Request auf ein Skript in DEINER Domain, das führt den eigentlichen Soap-Request aus und reicht das Ergebnis in der Ajax-Response zurück an den Client. Für das serverseitige Skript hast du z.B. mit PHP recht bequeme Möglichkeiten.

Gruß
Thomas

Hallo,
da weiß ich leider nicht weiter.
Gruß Chris