# Webservice per Javascript ansprechen



## malt1981 (8. Sep 2019)

Hallo zusammen,
ich versuche mich gerade in Webservices. Mein Plan wäre, einen Webservice per Javascript anzusprechen.
Hierfür habe ich einen rudimentären Webservice in Eclipse erstellt. Ich nutze openJDK11 und einen Tomcat9 Webserver (Axis 1).
Der Webservice scheint zu funktionieren, da ich ihn mit der SoapUi ansprechen kann. Request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test">
   <soapenv:Header/>
   <soapenv:Body>
      <test:adder>
         <test:a>5</test:a>
         <test:b>1</test:b>
      </test:adder>
   </soapenv:Body>
</soapenv:Envelope>

liefert

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <adderResponse xmlns="http://test">
         <adderReturn>6</adderReturn>
      </adderResponse>
   </soapenv:Body>
</soapenv:Envelope>

Leider bekomme ich es aber nicht hin, dass ein Javascript einen Respons liefert. Ich hätte es wie folgt versucht:

<html>
<head>
    <title>SOAP JavaScript Client Test</title>
    <script type="text/javascript">
        function soap() {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'http://localhost:8080/WebServiceTest/services/Adder', true);
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');

            var sr =
                '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test">' +
                '<soapenv:Header/>' +
                '<soapenv:Body>' +
                '<test:adder>' +
                '<test:a>5</test:a>' +
                '<test:b>1</test:b>' +
                '</test:adder>' +
                '</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');
                    }
                }
            }
            // Send the POST request

            xmlhttp.send(sr);

            // send request

            var res = xmlhttp.responseText;
            alert(res);
        }
    </script>
</head>
<body>
    <form name="Demo" action="" method="post">
        <div>
            <input type="button" value="SoaP" onclick="soap();" />
        </div>
    </form>
</body>
</html>

Ich bekomme einfach kein Ergebnis.
Ich habe mir schon die Finger wund gegoogelt, leider wirds nicht besser.

Ich wäre über jede Hilfe sehr dankbar.


----------



## mihe7 (8. Sep 2019)

malt1981 hat gesagt.:


> ich versuche mich gerade in Webservices. Mein Plan wäre, einen Webservice per Javascript anzusprechen.


Ist SOAP zwingend? Ansonsten einfach REST-Services verwenden. Außerdem: nutz die Fetch API. 

Unabhängig davon: die HTML/JS Seite muss von der gleichen Quelle (Domain/Port) geliefert werden. Ist dies nicht der Fall, handelt es sich um einen Cross-Origin-Request, der aufgrund der Same-Origin-Policy der Browser "nicht einfach so" zugelassen wird. Vielmehr muss der Server einen solchen Zugriff explizit erlauben (CORS Header).


----------



## malt1981 (9. Sep 2019)

mihe7 hat gesagt.:


> Unabhängig davon: die HTML/JS Seite muss von der gleichen Quelle (Domain/Port) geliefert werden.



Vielen Dank, das wars. Der Vollständigkeit halber: Ich habe noch ergänzt:
xmlhttp.setRequestHeader( "SOAPAction", 'testStringRequest' );

Als Anfänger habe ich aber nun doch noch ein Verständnisproblem:
Wenn HTML/JS von der gleichen Quelle wie der WebService kommen müssen, wie kann man dann einen "fremden" WebService ansprechen?
Sorry für die doofe Frage, muss noch viel lernen.
Danke auch für den Tipp mit REST, schaue ich mir als Alternative auch an.


----------



## httpdigest (9. Sep 2019)

Folgende Möglichkeiten:
1. CORS (wie von @mihe7 ja bereits erwähnt)
2. Du lädtst das JavaScript von der Domäne des fremden WebServices (falls dieser einen JavaScript-Client bereitstellt) - Same Origin Policy bedeutet ja nur, dass JavaScript, welches von Domäne X geladen wurde, nur XHR Requests auf diese Domäne ausführen darf. Du kannst aber sehr wohl JavaScript einer anderen Domäne Y laden (z.B. per <script src="https://Y/whatever.js"></script>, so dass dieses JavaScript dann Aufrufe auf diese Domäne Y durchführen darf.
3. Üblicherweise ruft man keine WebServices vom Frontend aus auf, sondern tut dies in seinem eigenen Backend. Also triggerst du vom Frontend/Browser aus per irgendwie geartetem Request dein Backend und dieses ruft dann Drittservices auf


----------



## malt1981 (9. Sep 2019)

ok, vielen Dank für die Aufklärung. Wenn Variante 3 die Übliche ist, mache ich mich wohl auf diesen Weg 
Danke euch beiden.


----------



## mihe7 (9. Sep 2019)

Wobei man bei Punkt 3 von @httpdigest anmerken muss, dass sich die Aussage in erster Linie auf Services (meist Dritter) bezieht, die für die Anwendungslogik relevant sind. 

Anders formuliert: es gibt selbstverständlich Services, die man vom Frontend aus anspricht. Das sind häufig z. B. "REST"-Services, mit denen Daten zwischen Frontend und Backend ausgetauscht werden, vornehmlich im JSON-Format (REST habe ich dabei mal in Anführungszeichen gesetzt, da diese oft nicht das charakteristische Kriterium erfüllen, im Praxis-Alltag trotzdem so bezeichnet werden). Daneben können aber auch Dienste vom Frontend angesprochen werden, die nur für das Frontend interessant sind (z. B. Kartendienste wie WMS/WMTS oder Geocoding APIs, ggf. auch Abfragen fremder Datenbanken, wenn es nur um die Anzeige der Ergebnisse geht, Wetterdienste usw. usf.) 

Möglichkeiten gibt es auf jeden Fall mehr als genug


----------

