Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Rheinwerk Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 13 RESTful und SOAP Web-Services
Pfeil 13.1 Web-Services
Pfeil 13.2 RESTful Web-Services
Pfeil 13.2.1 Aus Prinzip REST
Pfeil 13.2.2 Jersey
Pfeil 13.2.3 JAX-RS-Annotationen für den ersten REST-Service
Pfeil 13.2.4 Test-Server starten
Pfeil 13.2.5 REST-Services konsumieren
Pfeil 13.2.6 Content-Hander, Marshaller und verschiedene MIME-Typen
Pfeil 13.2.7 REST-Parameter
Pfeil 13.2.8 REST-Services mit Parametern über die Jersey-Client-API aufrufen
Pfeil 13.2.9 PUT-Anforderungen und das Senden von Daten
Pfeil 13.2.10 PUT/POST/DELETE-Sendungen mit der Jersey-Client-API absetzen
Pfeil 13.3 Daily Soap und das SOAP-Protokoll
Pfeil 13.3.1 Die technische Realisierung
Pfeil 13.3.2 Web-Service-APIs und Implementierungen
Pfeil 13.3.3 @WebService in Java 6
Pfeil 13.3.4 Einen Web-Service definieren
Pfeil 13.3.5 Web-Services veröffentlichen
Pfeil 13.3.6 Einen JAX-WS-Client implementieren
Pfeil 13.4 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

13.3 Daily Soap und das SOAP-ProtokollZur nächsten Überschrift

Bei den Firmen DevelopMentor, IBM, Lotus Development Corp., Microsoft und UserLand Software entstand das XML-basierte SOAP-Protokoll (bis Version 1.2 stand die Abkürzung für Simple Object Access Protocol). Es wird seit 1998 entwickelt und bietet einen einfachen Zugriff auf Server-Ressourcen mit den etablierten Web-Standards HTTP und XML. SOAP selbst beschreibt die Art und Weise, wie Inhalte (Serialisierung) und die XML-Daten übertragen werden. Die Übertragung hat mit SOAP aber eigentlich nichts zu tun, denn dafür sind andere Protokolle definiert. HTTP ist ein ideales Transportprotokoll, da es für Web-Seiten in der Regel keine Beschränkungen von Firewalls gibt. Die beiden Kommunikationsparteien regeln mit SOAP so einen entfernten Methodenaufruf, der die Parameter und Ergebnisse in XML kodiert und überträgt. Durch die unabhängigen und anerkannten Web-Standards bietet SOAP gegenüber RMI oder CORBA den Vorteil, nicht an eine Programmiersprache gebunden zu sein. Da Microsoft federführend bei der Spezifikation war und das .NET-Framework seine Kommunikation vollständig auf SOAP aufbaut, kann ein Java-Client theoretisch auf in C# implementierte SOAP-Dienste zurückgreifen. Die Übertragung kommt auch Oracle mit seinem Ziel einer betriebssystem- und plattformunabhängigen Schnittstelle entgegen.

Probleme von SOAP

Den Vorteilen stehen allerdings einige Nachteile gegenüber. Die XML-Repräsentation der Dokumente macht die Dokumente groß und ein Parsen der Parameter und Ergebnisse auf beiden Seiten erforderlich. In Umgebungen, die eine performante Übertragung fordern – etwa bei der Kommunikation zwischen mobilem Endgerät und Server –, wird sich SOAP nicht so schnell durchsetzen. Des Weiteren ist auch die Sicherheit von SOAP-Verbindungen noch nicht hinreichend gelöst. Ein Client könnte sich mit einem Server verbinden und einen Aufruf starten, obwohl die Berechtigung fehlt. Sicherheitseigenschaften müssten erst auf der Serverseite implementiert werden. Die in Klartext übertragenen Nachrichten bilden ein weiteres Problem, das SSL jedoch verhindern kann.


Rheinwerk Computing - Zum Seitenanfang

13.3.1 Die technische RealisierungZur nächsten ÜberschriftZur vorigen Überschrift

Ein Clientprogramm besorgt sich, wie bei entfernten Programmen üblich, eine Referenz auf das entfernte Objekt. Das ist eine URL auf einen RPC-Router. Dieser Router wird mittels einer normalen HTTP-POST-Anfrage aktiviert. Er bekommt über den Client eine XML-kodierte Nachricht (der Content-Typ ist einfach text/html), in der die aufzurufende Methode und ihre Parameter kodiert sind. Der RPC-Router nimmt diese Nachricht entgegen, parst das empfangene XML-Dokument und leitet die Anfrage an die Methode weiter. Diese produziert die Ausgabe, die wiederum als XML-Dokument über die Antwort vom Server zum Client geschickt wird. Der Client nimmt das Ergebnis entgegen, und die Kommunikation ist beendet.

SOAP bietet für entfernte Methodenaufrufe einige Standarddatentypen an. Zu diesen gehören einfache Datentypen wie Ganzzahlen, Fließkommazahlen, Zeit- und Datumsangaben und Binärdaten. Außerdem unterstützt SOAP zusammengesetzte Datentypen wie Strukturen und Arrays. Wie diese Daten nun tatsächlich in eine XML-Nachricht umgesetzt werden, müssen wir glücklicherweise nicht wissen. Als Endanwender kommen wir mit der Nachricht nicht in Kontakt.


Rheinwerk Computing - Zum Seitenanfang

13.3.2 Web-Service-APIs und ImplementierungenZur nächsten ÜberschriftZur vorigen Überschrift

SOAP ist nur ein Standard zum Austausch von Daten, aber kein Framework. Für Java gibt es zwei APIs für Web-Services:

  • JAX-WS 2.0/2.1 (Java API for XML-Based Web Services 2.0) ist die aktuelle Web-Service-API, die im JSR-224 spezifiziert wird.
  • JAX-RPC ist der Vorläufer von JAX-WS. Die API wurde im JSR-101, »Java APIs for XML based RPC«, spezifiziert, gilt aber heute als veraltet. Obwohl JAX-WS als Nachfolger von JAX-RPC gilt, haben sie doch eigentlich nichts miteinander zu tun. Die Spezifikation endete mit der Version 1.1.

Diese APIs werden über diverse Implementierungen umgesetzt.

Tabelle 13.3: SOAP-Implementierungen

Implementierung Bemerkungen

JAX-WS Referenzimplementierung
(https://jax-ws.dev.java.net/)

Die JAX-WS RI ist Teil des Projekts Metro, eines kompletten Web-Service-Stacks

Apache Axis2 (http://ws.apache.org/axis2/)

Axis ist ein Klassiker im SOAP-Geschäft[95](Von Axis gibt es zwei Versionen: Axis2 (http://ws.apache.org/axis2/) und Axis (http://ws.apache.org/axis/). Axis2 ist eine komplette Neuimplementierung von Axis (1), und Axis (1) endete 2006. Vor Apache Axis gab es Apache SOAP, aber das ist noch viel älter ...) ] . Axis2 implementiert JAX-WS, und das ältere Axis (1) implementiert die JAX-RPC-API.

Apache CXF (http://cxf.apache.org/)

CXF implementiert JAX-WS und auch JAX-RPC. Sie geht auf XFire und Ionas Celtix zurück.

Codehaus XFire (http://xfire.codehaus.org/)

Die Entwicklung von XFire stoppte im Mai 2007. Sie wird in CXF weitergeführt.

JDK

Das JDK ab Version 6 integriert die Referenzimplementierung der aktuellen JAX-WS-2.1-Spezifikation, und JDK 7 JAX-WS 2.2. Sie enthalten nicht das alte JAX-RPC.

Da die JAX-WS-API und -Implementierung seit Java 6 integriert ist, können wir Web-Service-Beispiele ohne Zusatzaufwand realisieren. Für die Java-Version 5 müssen weitere Bibliotheken in den Klassenpfad aufgenommen werden.


Rheinwerk Computing - Zum Seitenanfang

13.3.3 @WebService in Java 6Zur nächsten ÜberschriftZur vorigen Überschrift

In Java 6 wurden viele interessante Techniken integriert, um Web-Services einfach zu definieren und anzusprechen. Im ersten Schritt wollen wir einen Web-Service definieren und implementieren sowie ihn automatisch am integrierten Mini-Web-Server anmelden. Die zentrale statische Methode dazu heißt Endpoint.publish(). Im nächsten Schritt lassen wir uns über ein mitgeliefertes Tool wsimport Zugriffsklassen generieren, um auf unseren selbst definieren Web-Service sowie den existierenden Web-Service von »JavaPortal News« im Internet zuzugreifen.


Rheinwerk Computing - Zum Seitenanfang

13.3.4 Einen Web-Service definierenZur nächsten ÜberschriftZur vorigen Überschrift

Web-Services mit JAX-WS 2 sind einfache Java-Klassen, die mit speziellen Annotationen versehen sind. Die Annotationen aus dem Paket javax.jws sind im Einzelnen:

  • @WebService: Jede Web-Service-Implementierung muss diese Klassen-Annotation besitzen. Optionale Elemente sind zum Beispiel name (bestimmt den <wsdl:portType>, Standard ist der unqualifizierte Name der Klasse bzw. Schnittstelle), targetNamespace, serviceName oder portName.
  • @SOAPBinding: Setzt den Stil der Nachrichten auf Dokument oder RPC.
  • @WebMethod: Die Annotation macht eine Methode zur Web-Service-Operation. Der Standard-Name unter <wsdl:operation> ist der Name der Methode; er lässt sich mit dem Element operationName ändern.
  • @WebParam: Beschreibt die Parameter genauer. Das Element name überschreibt den Parameternamen, der sonst »argX« hieße, für das WSDL-Element <wsdl:part>.
  • @WebResult: Bestimmt die Rückgabe einer Web-Service-Methode genauer.
  • @OneWay: Wird für asynchrone Aufrufe genutzt.

Wirklich nötig sind nur @WebMethod, @SOAPBinding und @WebService.

Beispiel

Unser folgender Web-Service deklariert zwei Methoden zur Veröffentlichung:

Listing 13.11: com/tutego/insel/ws/MyWebServices.java

package com.tutego.insel.ws;

import javax.jws.*;
import javax.jws.soap.SOAPBinding;

@WebService(name="ChrisWebServices")
@SOAPBinding(style = SOAPBinding.Style.RPC)

public class MyWebServices
{
@WebMethod
public String hello( String name )
{
return "Hello " + name + "!";
}

@WebMethod(operationName="body-mass-index")
@WebResult(name = "your-bmi")
public double bmi( @WebParam(name="height") double height,
@WebParam(name="weight") double weight )
{
return weight / ((height * height) / 10000);
}
}

Rheinwerk Computing - Zum Seitenanfang

13.3.5 Web-Services veröffentlichenZur nächsten ÜberschriftZur vorigen Überschrift

Ein SOAP-Server muss die Anfragen entgegennehmen und an eine Java-Methode weiterleiten. In der Java-Welt realisieren üblicherweise Servlets eines Web-Containers die Annahme; sie nehmen die XML-Pakete entgegen, nehmen die Anfrage auseinander und leiten sie zur jeweiligen Implementierung weiter.

Die Veröffentlichung eines Web-Service ist sehr stark von der verwendeten Umgebung – sprich: dem Container und der Implementierung – abhängig. In Java 6 ist das Anmelden ein Einzeiler, denn ein kleiner eingebetteter Web-Server veröffentlicht einen Web-Service unkompliziert. Im Mittelpunkt stehen die Klasse Endpoint und die statische Methode publish(), die unter einer gegebenen URL eine Endpunkt-Implementierung anmeldet.

Listing 13.12: com/tutego/insel/ws/PublishWsOnServer.java

package com.tutego.insel.ws;

import javax.swing.JOptionPane;
import javax.xml.ws.Endpoint;

public class PublishWsOnServer
{
public static void main( String[] args )
{
Endpoint endpoint = Endpoint.publish( "http://localhost:8080/services",
new MyWebServices() );
JOptionPane.showMessageDialog( null, "Server beenden" );
endpoint.stop();
}
}

Der Server veröffentlicht unseren Web-Service und bietet die WSDL-Beschreibungsdatei unter der URL http://localhost:8080/services?wsdl an.


Rheinwerk Computing - Zum Seitenanfang

13.3.6 Einen JAX-WS-Client implementierenZur nächsten ÜberschriftZur vorigen Überschrift

Da entfernte Web-Service-Aufrufe am besten wie lokale Aufrufe über eine Java-Schnittstelle statisch gebunden sind, soll ein Dienstprogramm aus einer gegebenen WSDL-Datei Hilfsklassen für den komfortablen Zugriff generieren. Je nach Implementierung gibt es diverse Generatoren, und Oracle liefert ab JDK 6 das Tool wsimport mit.

wsimport

Das Kommandozeilentool wsimport wenden wir auf den einen Web-Service an. Des Weiteren gibt es eine Reihe von freien Web-Services im Internet, von denen http://www.webservicex.net/ einige anbietet. Wir entscheiden uns für einen GEO-IP-Service, die zur IP-Adresse das Land ermittelt, aus dem der Server wohl stammt. Die Web-Seite http://www.webservicex.net/ws/WSDetails.aspx?WSID=64&CATID=12 gibt eine WSDL-URL http://www.webservicex.net/geoipservice.asmx?WSDL zurück.

Da die Umsetzung automatisiert werden soll, setzen wir den Aufruf von wsimport in ein Skript:

Listing 13.13: useWsimport.bat

PATH=%PATH%;C:\Program Files\Java\jdk1.7.0\bin
wsimport -s src -p com.tutego.insel.ws.gen.geoipservice http://www.webservicex.net/Zeilenumbruch
geoipservice.asmx?WSDL
wsimport -d src -keep -p com.tutego.insel.ws.gen.chrisws http://localhost:8080/Zeilenumbruch
services?wsdl

Der Schalter -d bestimmt den Pfad für die Quellen. Die Option -keep legt fest, dass die Quellen überhaupt generiert werden, und -p bezeichnet das Paket.

Am Ende hat wsimport die gewünschten Pakete mit unterschiedlichen Typen generiert:

  • com.tutego.insel.ws.gen.chrisws.ChrisWebServices.java
  • com.tutego.insel.ws.gen.chrisws.MyWebServicesService.java
  • com.tutego.insel.ws.gen.geoipservice.GeoIP.java
  • com.tutego.insel.ws.gen.geoipservice.GeoIPService.java
  • com.tutego.insel.ws.gen.geoipservice.GeoIPServiceSoap.java
  • com.tutego.insel.ws.gen.geoipservice.GetGeoIP.java
  • com.tutego.insel.ws.gen.geoipservice.GetGeoIPContext.java
  • com.tutego.insel.ws.gen.geoipservice.GetGeoIPContextResponse.java
  • com.tutego.insel.ws.gen.geoipservice.GetGeoIPResponse.java
  • com.tutego.insel.ws.gen.geoipservice.ObjectFactory.java
  • com.tutego.insel.ws.gen.geoipservice.package-info.java
Hinweis

Leider ist es blauäugig anzunehmen, dass für jede WSDL-Datei das Tool wsimport die Zugriffsklassen baut. Das Dienstprogramm ist sehr wählerisch, und vieles funktioniert nicht. Eine häufige Fehlermeldung – etwa auf Googles WSDL-Datei – wird diese hier sein:

error: rpc/encoded wsdls are not supported in JAXWS 2.0.

Hier hilft nur eine ausführliche Analyse, Google oder http://stackoverflow.com/.

Client mit Service-Klassen

Wichtig sind jeweils die Klassen, die auf -Service enden, denn sie ermöglichen den Zugriff auf die entfernten Methoden.

Listing 13.14: com/tutego/insel/ws/ClientForGeneratedStubs.java

package com.tutego.insel.ws;

import com.tutego.insel.ws.gen.chrisws.*;
import com.tutego.insel.ws.gen.geoipservice.*;

public class ClientForGeneratedStubs
{
public static void main( String[] args )
{
GeoIPServiceSoap ipService = new GeoIPService().getGeoIPServiceSoap();
GeoIP geoIP = ipService.getGeoIP( "193.99.144.85" );
System.out.println( "IP-Adresse kommt aus " +
geoIP.getCountryCode() );

ChrisWebServices port = new MyWebServicesService().getChrisWebServicesPort();
System.out.printf( "%s Dein BMI ist %.1f%n",
port.hello( "Chris" ),
port.bodyMassIndex( 183, 84 ) );
}
}

Mit gestartetem Server gibt der Client zum Beispiel die folgenden Ausgaben aus:

IP-Adresse kommt aus DEU
Hello Chris! Your BMI is 25,1


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Neuauflage: Java SE 8 Standard-Bibliothek
Neuauflage: Java SE 8 Standard-Bibliothek
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Einstieg in Eclipse






 Einstieg in Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de