Java: SOAP – Web Service Client schreiben

Web Service ClientIn den letzten Wochen habe ich gebloggt, wie man einen sehr einfachen Web Service in Java veröffentlichen/bereitstellen kann. Jetzt es geht um die Nutzung eines Web Services. Hierfür wird ein sogenannter Client benötigt, den ich zunächst in Java implementieren werde. (Hier ist Beitrag zu PHP) Ausgangspunkt ist wieder mein Rechteck Web Service.

ACHTUNG! Für bekennende Java-Entwickler habe ich hier einen ausführlicheren Beitrag geschrieben!

 

 

 

Das Environment

Die Grundvoraussetzung, um einen Web Service rufen zu können, ist die Erreichbarkeit der WSDL. Diese können Sie ganz einfach testen, indem Sie die WSDL-URL im Browser eingeben. Bei meinem Beispiel sieht das Ergebnis so aus:
WSDL im Chrome
Zuvor habe ich das Beispiel „RechteckWS-Server“ heruntergeladen, das Projekt in Eclipse importiert und die Server-Klasse ausgeführt…

 

WSImport bitte!

Ist die WSDL erreichbar, kann man sich nun die Schnittstellen-Klassen aus der WSDL generieren lassen. Hierzu wird das Programm „WSImport“ verwendet. Dieses Programm ist seit JDK 1.6 fester Bestandteil der Spezifikation und muss daher nicht nach installiert werden!
Um die Schnittstellen-Klassen zu generiert, muss das Target namens „create-rechteck-service“ ausgeführt werden. Dieses befindet sich in der „build.xml“-Datei. (Wie ein Ant-Target ausgeführt wird, finden Sie hier.)
Denkt bitte daran, dass der Pfad in Zeile 5 noch je nach Java-Version und Betriebssystem angepasst werden muss.

...
	<property name="generated" value="generated" />
	<property name="generated.src" value="${generated}/src" />
	<property name="classes.dir" value="bin" />
	<property name="wsimport.exec" value="C:\Programme\Java\jdk1.6.0_27\bin\wsimport.exe" />

	<target name="create-rechteck-service">
		<antcall target="create-ws">
			<param name="package" value="de.axxg.rechteckws" />
			<param name="wsdl.location" value="http://localhost:9202/rechteck/RechteckWebService?wsdl" />
		</antcall>
	</target>
	

	<target name="create-ws">
		<exec executable="${wsimport.exec}">
			<arg value="-s" />
			<arg value="${generated.src}" />
			<arg value="-d" />
			<arg value="${classes.dir}" />
			<arg value="-p" />
			<arg value="${package}" />
			<arg value="${wsdl.location}" />

		</exec>
	</target>
...

 

Die Client-Klasse

Der Client besteht hauptsächlich aus zwei Objekten: Einer Service-Factory und einem Service. Die Service-Factory und der Service wurde von WSImport generiert und befindet sich im Ordner „generated/src/“. Standardmäßig besteht der Name der Service-Factory-Klasse aus der Web Service-Bezeichnung und dem Zusatz „_Service“. Hingegen besteht der Name der Service-Klasse nur aus der Bezeichnung des Web Services.
Nach dem instantiieren der Service-Factory wird das Service-Objekt mit Hilfe der „get*Name des Web Services*Port“-Methode erzeugt.
Fertig!
Mit dem Service-Objekt kann man nun alle Methoden des Web Service rufen/ausführen. So oft, wie man will….

package main;

import de.axxg.rechteckws.RechteckWebService;
import de.axxg.rechteckws.RechteckWebService_Service;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// Service-Factory
		RechteckWebService_Service myRechteckWebService_Service = new RechteckWebService_Service();
		
		// Der eigentliche Ws - die Methode heißt so, wie der Ws
		RechteckWebService myService = myRechteckWebService_Service.getRechteckWebServicePort();
		
		float ergUmfang = myService.berechneUmfang(4, 5);
		float ergInhalt = myService.berechneInhalt(4, 5);
		
		System.out.println("Flächeninhalt: " + ergInhalt);
		System.out.println("Umfang: " + ergUmfang);
	}

}

In einem weiteren Beitrag werde ich erläutern, wie man die Service-Factory konfiguriert, um andere WSDL-URL-Adressen anzusprechen.

 

Die build.xml

<project name="RechteckWebServiceClient" default="release" basedir=".">
	<property name="jaxws-version" value="2.0" />
	<property name="jar.file" value="${ant.project.name}.jar"/>
	<property name="generated" value="generated" />
	<property name="generated.src" value="${generated}/src" />
	<property name="classes.dir" value="bin" />
	<property name="wsimport.exec" value="C:\Programme\Java\jdk1.6.0_27\bin\wsimport.exe" />


	<target name="clean">
		<delete failonerror="false" includeemptydirs="true">
			<fileset dir="${generated.src}" />
		</delete>
		<mkdir dir="${generated}" />
		<mkdir dir="${generated.src}" />
	</target>

	<target name="release" depends="clean,create-rechteck-service, jar" />

	<target name="create-rechteck-service">
		<antcall target="create-ws">
			<param name="package" value="de.axxg.rechteckws" />
			<param name="wsdl.location" value="http://localhost:9202/rechteck/RechteckWebService?wsdl" />
		</antcall>
	</target>
	
	<target name="jar">
		<jar destfile="release/${jar.file}">
			<zipfileset dir="${classes.dir}" includes="**/*.*" />
		</jar>
	</target>

	<target name="create-ws">
		<exec executable="${wsimport.exec}">
			<arg value="-s" />
			<arg value="${generated.src}" />
			<arg value="-d" />
			<arg value="${classes.dir}" />
			<arg value="-p" />
			<arg value="${package}" />
			<arg value="${wsdl.location}" />

		</exec>
	</target>

</project>

 

Beispiel

Web Service Client in Java

 

Copyright © 2011 AxxG – Alexander Gräsel



7 Antworten : “Java: SOAP – Web Service Client schreiben”

  1. Manhattanscout sagt:

    Toller Artikel Alexander. Das einzige Problem ist, dass ich den Artikel vor einem Jahr haette gebrauchen koennen.

    Gruesse aus New York.

  2. bhandari4u sagt:

    this is a great wsimport example with downloadable app. thanks for sharing. i also blogged about wsimport web service client recently

  3. Paula Neeb sagt:

    Tolle Artikel jetzt habe ich auch verstanen wie es funktioniert

  4. Werner sagt:

    Herzlichen Dank Alexander. Genau sowas hab ich gesucht. Ich hab das Vorgehen mit einem eigenen Webservice ausprobiert, und es hat auf Anhieb geklappt, zu meiner eigenen Überraschung 😉 Das spricht für die Qualität deines Tutorials! 🙂

Kommentar verfassen