Forum: PC-Programmierung Javascript - XMLHttpRequest tut nicht, warum?


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Kann mir mal jemand bitte einen Tip geben, warum das Script nach der 
markierten Stelle einfach nix mehr tut? Die enthaltenen Zugangsdaten 
sind echt, aber kein Problem, es ist ein Testsystem. Danke für Hilfe!
1
<html>
2
<head>
3
    <title>SOAP JavaScript Client Test</title>
4
    <script type="text/javascript">
5
6
        function soapTest()
7
        {
8
            var request = new XMLHttpRequest();         
9
            var xmls = "";
10
11
            xmls+="<?xml version='1.0' encoding='utf-8'?>";
12
            xmls+="<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' ";
13
            xmls+="xmlns:ns='http://dpd.com/common/service/types/LoginService/2.0'>";
14
            xmls+="<soapenv:Body>";
15
            xmls+="<ns:getAuth>";
16
            xmls+="<delisId>sandboxdpd</delisId>";
17
            xmls+="<password>xMmshh1</password>";
18
            xmls+="<messageLanguage>de_DE</messageLanguage>";
19
            xmls+="</ns:getAuth>";
20
            xmls+="</soapenv:Body>";
21
            xmls+="</soapenv:Envelope>";
22
               
23
            request.open("POST", "https://public-ws.dpd.com/services/LoginService/V2_0/?wsdl", false);
24
            request.setRequestHeader("SOAPAction","http://dpd.com/common/service/LoginService/2.0/getAuth");
25
            request.setRequestHeader("Content-Type", "text/xml");
26
           
27
            alert(xmls);
28
            alert("es get los ...");
29
30
            request.send(xmls);    //<====== hier geht nix mehr :-(
31
32
            alert("es ist durch ...");
33
            alert(request.responseText);
34
        }
35
    </script>
36
</head>
37
<body> 
38
            <input type="button" value="Soap" onclick="soapTest();" />
39
</body>
40
</html>

Der letzte Parameter bei request.open() ist mit Absicht "false", d.h. 
das Script wartet, bis ein Ergebnis kommt (synchron), ansonsten rauscht 
es dort einfach durch (asynchron), aber Ergebnisse kommen dann auch 
keine ... nichtmal eine Fehlermeldung. Damit ist der Server ansonsten 
sehr freigiebig

: Bearbeitet durch User
von Christobal M. (c_m_1)


Lesenswert?

Hast du mit wireshark nachgesehen ob der request raus geht? Eventuell 
wartet das Script nur auf einen Response/Timeout.

von 3.14 (Gast)


Lesenswert?

Gibt es irgendeine Meldung in der Entwicklerkonsole?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

3.14 schrieb:
> Gibt es irgendeine Meldung in der Entwicklerkonsole?

guter Hinweis, hatte ich übersehen:

"Quellübergreifende (Cross-Origin) Anfrage blockiert: Die 
Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf 
https://public-ws.dpd.com/services/LoginService/V2_0/?wsdl. (Grund: 
CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt)."

Habe das File auf dem Desktop liegen und nicht in einem Server. Brrrr

von 3.14 (Gast)


Lesenswert?

Frank E. schrieb:
> 3.14 schrieb:
> Gibt es irgendeine Meldung in der Entwicklerkonsole?
>
> guter Hinweis, hatte ich übersehen:
>
> "Quellübergreifende (Cross-Origin) Anfrage blockiert: Die
> Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf
> https://public-ws.dpd.com/services/LoginService/V2_0/?wsdl. (Grund:
> CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt)."
>
> Habe das File auf dem Desktop liegen und nicht in einem Server. Brrrr

Setz dir ein Apache auf (Standardkonfiguration) und mach deine Projekte 
darin. Aber sei vorsichtig, dass keine Portfreigaben eingerichtet sind. 
Das Problem wird aber bleiben. Um es zu beheben, hast du die Möglichkeit
a) den Serverdienst auf den eigenen Server verfrachten (evtl. PHP oä 
installieren)
b) JSONP verwenden (ist viel einfacher, als es klingt)

von Hacker (Gast)


Lesenswert?

Hmm... Magst Du Dir ein neues Passwort machen?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

So Passwort geändert ... ist aber m.E: unkritisch, weil eh nur Sandbox.

Aber: Ich habe das Script jetzt in den Apache meiner Synology versetzt, 
anstatt direkt als File zu öffen. Es "klemmt " aber immer noch an der 
gleichen Stelle.

Ursprünglich dachte ich ja an ein Rechte-Problem: Von wegen File und 
aktive Inhalte - Browser haben da sehr eigene Ansichten - ist aber 
nicht. Bis zum ersten Alert wird es ausgeführt und dann ist Ende. Auch 
kein Timeout, es sei denn, dieses ist 20min lang ... Mist.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich habe mich jetzt nochmal zum Thema CORS belesen - "tolle" Erfindung.

Das heisst am Ende, ich kann keinen XMLHttpRequest auf eine Domäne 
machen, in der nicht auch mein eigenes Script liegt. Das ist echt super 
z.B. für die Kontaktaufnahme zu einem Paketdient ...

Damit ist dieser Versuch wohl erledigt.

von Pico (Gast)


Lesenswert?

Es sei denn, der Server erlaubt es.

von Rene K. (xdraconix)


Lesenswert?

Frank E. schrieb:
> Ich habe mich jetzt nochmal zum Thema CORS belesen - "tolle"
> Erfindung.
>
> Das heisst am Ende, ich kann keinen XMLHttpRequest auf eine Domäne
> machen, in der nicht auch mein eigenes Script liegt. Das ist echt super
> z.B. für die Kontaktaufnahme zu einem Paketdient ...
>
> Damit ist dieser Versuch wohl erledigt.

Das hat ja auch seinen Grund. Aus Sicherheitstechnicher Sicht wäre dies 
ein absoluter Super-Gau. Und wie bereits erwähnt kann man dies 
"freischalten" auf dem Server. Dies macht man aber auch nur für bekannte 
IPs.

Wenn der Paketdienst eine "Kontaktaufnahme" wünscht. Dann stellt er auch 
eine Möglichkeit dazu bereit (JSON, XML File, UDP Req,...).

Wie wäre es in diesem Fall, wenn du einfach mal den Paketdienst fragst 
welche Möglichkeiten er bietet die nötigen Informationen zu bekommen?


Hier eine API von DPD:

https://www.shippypro.com/dpd-API.html

Wie man sieht ist diese nicht kostenfrei, deswegen wird es auch keine 
kostenfreie Schnittstelle nach außen geben. ?

: Bearbeitet durch User
von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo Frank,
lad Dir mal SoapUI runter und trag dort Deine Daten so ein wie Du sie 
sendest, dann kannst Du relativ genau sehen was passiert.

Gruß
Frank

von Frank L. (Firma: Flk Consulting UG) (flk)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich habe das mal eben durchlaufen lassen. Da Deine Passwort natürlich 
geändert wurde erhalte ich keine Antwort bzw. ein "Fault occured". Der 
Service antwortet also.

Im Anhang mal das Ergebnis aus SoapUI.

Gruß
Frank

: Bearbeitet durch User
von woas i nit (Gast)


Lesenswert?

da steht doch genau was der fehler ist:
1
<errorCode>LOGIN_8</errorCode>
2
<errorMessage>Die Kombination aus Benutzername und Passwort ist unbekannt.</errorMessage>

von CORS-Liebhaber (Gast)


Lesenswert?

Frank E. schrieb:
> Ich habe mich jetzt nochmal zum Thema CORS belesen - "tolle" Erfindung.
>
> Das heisst am Ende, ich kann keinen XMLHttpRequest auf eine Domäne
> machen, in der nicht auch mein eigenes Script liegt. Das ist echt super
> z.B. für die Kontaktaufnahme zu einem Paketdient ...
>
> Damit ist dieser Versuch wohl erledigt.

Google mal nach "CORS-Proxies". Statt per XMLHttpRequest direkt auf die 
gewünschte Resource zuzugreifen, schickt man seinen Request stattdessen 
an den CORS-Proxy, teilt ihm mit, auf welche URL man eigentlich 
zugreifen möchte, und bekommt dann vom Proxy die gewünschte Ressource 
zurückgeliefert, aber mit passendem "Access-Control-Allow-Origin 
*"-CORS-Header.

Und schwupps, schon hat man das völlig schwachsinnige Sicherheitskonzept 
hinter CORS einfach ad absurdum geführt.

von DPA (Gast)


Lesenswert?

CORS-Liebhaber schrieb:
> Und schwupps, schon hat man das völlig schwachsinnige Sicherheitskonzept
> hinter CORS einfach ad absurdum geführt.

No, hat man nicht. Der sinn von cors ist es unter anderem, dass eine 
seite nicht einfach so im nahmen eines anderen anhand seiner session 
genutzt werden kann. Ein cors proxy hat einen anderen origin, und damit 
nicht die selben session cookies. Natürlich muss das mit techniken wie 
stp kombiniert werden, um effektiv zu sein. Ein anderer Aspekt ist, dass 
dank CORS webbrowser nicht als proxies misbraucht werden können.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.