JAX-WS wird mit JDK 1.6 geliefert, wodurch die Entwicklung von Java-Web-Services einfacher wird. In diesem Lernprogramm erfahren Sie, wie Sie die folgenden Aufgaben ausführen:
-
Erstellen Sie mithilfe von JAX-WS einen SOAP-basierten Webdienstendpunkt im RPC-Stil.
-
Erstellen Sie einen Java-Webdienst-Client manuell.
-
Erstellen Sie einen Java-Webdienstclient über das wsimport -Tool.
-
Erstellen Sie einen Ruby-Webdienst-Client.
Sie werden überrascht sein, wie einfach es ist, einen Webdienst im RPC-Stil in JAX-WS zu entwickeln.
JAX-WS Web Service End Point
Die folgenden Schritte zeigen, wie Sie mit JAX-WS einen Webdienstendpunkt im RPC-Stil erstellen.
1. Erstellen Sie eine Web Service Endpoint-Schnittstelle
Datei: HelloWorld.java
package com.mkyong.ws; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; //Service Endpoint Interface @WebService @SOAPBinding(style = Style.RPC) public interface HelloWorld{ @WebMethod String getHelloWorldAsString(String name); }
2. Erstellen Sie eine Web Service Endpoint-Implementierung
Datei: HelloWorld Impl.java
package com.mkyong.ws; import javax.jws.WebService; //Service Implementation @WebService(endpointInterface = "com.mkyong.ws.HelloWorld") public class HelloWorldImpl implements HelloWorld{ @Override public String getHelloWorldAsString(String name) { return "Hello World JAX-WS " + name; } }
3. Erstellen Sie einen Endpoint Publisher
Datei: HelloWorldPublisher.java
package com.mkyong.endpoint; import javax.xml.ws.Endpoint; import com.mkyong.ws.HelloWorldImpl; //Endpoint publisher public class HelloWorldPublisher{ public static void main(String[]args) { Endpoint.publish("http://localhost:9999/ws/hello", new HelloWorldImpl()); } }
Führen Sie den Endpoint-Herausgeber aus, und Ihr " hello world web service " wird unter der URL " http://localhost : 9999/ws/hello " bereitgestellt.
4. Testen Sie es
Sie können den bereitgestellten Webdienst testen, indem Sie auf das generierte WSDL-Dokument (Web Service Definition Language) über diese URL " http://localhost : 9999/ws/hello? Wsdl " zugreifen.
Web Service Clients
Ok, der Web-Service ist ordnungsgemäß implementiert. Nun sehen Sie, wie Sie den Web-Service-Client für den Zugriff auf den veröffentlichten Service erstellen.
1. Java Web Service Client
Ohne Tool können Sie einen Java-Webdienst-Client wie folgt erstellen:
package com.mkyong.client; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import com.mkyong.ws.HelloWorld; public class HelloWorldClient{ public static void main(String[]args) throws Exception { URL url = new URL("http://localhost:9999/ws/hello?wsdl"); //1st argument service URI, refer to wsdl document above //2nd argument is service name, refer to wsdl document above QName qname = new QName("http://ws.mkyong.com/", "HelloWorldImplService"); Service service = Service.create(url, qname); HelloWorld hello = service.getPort(HelloWorld.class); System.out.println(hello.getHelloWorldAsString("mkyong")); } }
Ausgabe
Hello World JAX-WS mkyong
2. Java Web Service Client über das Tool wsimport
Alternativ können Sie das Tool " wsimport " verwenden, um die veröffentlichte WSDL-Datei zu analysieren und erforderliche Client-Dateien (Stub) für den Zugriff auf den veröffentlichten Webdienst zu generieren.
-
Wo ist wsimport? Dieses wsimport ** -Tool ist im JDK enthalten. Sie finden es unter " JDK PATH/bin__".
Geben Sie den Befehl " wsimport " aus.
wsimport -keep http://localhost:9999/ws/hello?wsdl
Es werden die erforderlichen Client-Dateien generiert. Dies hängt von der bereitgestellten WSDL-Datei ab. In diesem Fall werden eine Schnittstelle und eine Service-Implementierungsdatei generiert.
Datei: Hallo Welt.java
package com.mkyong.ws; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; /** ** ** This class was generated by the JAX-WS RI. ** JAX-WS RI 2.1.1 in JDK 6 ** Generated source version: 2.1 ** ** /@WebService(name = "HelloWorld", targetNamespace = "http://ws.mkyong.com/") @SOAPBinding(style = SOAPBinding.Style.RPC) public interface HelloWorld { /** ** ** ** @param arg0 ** @return ** returns java.lang.String ** / @WebMethod @WebResult(partName = "return") public String getHelloWorldAsString( @WebParam(name = "arg0", partName = "arg0") String arg0); }
Datei: HelloWorldImplService.java
package com.mkyong.ws; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.WebEndpoint; import javax.xml.ws.WebServiceClient; import javax.xml.ws.WebServiceFeature; /** ** ** This class was generated by the JAX-WS RI. ** JAX-WS RI 2.1.1 in JDK 6 ** Generated source version: 2.1 ** ** /@WebServiceClient(name = "HelloWorldImplService", targetNamespace = "http://ws.mkyong.com/", wsdlLocation = "http://localhost:9999/ws/hello?wsdl") public class HelloWorldImplService extends Service { private final static URL HELLOWORLDIMPLSERVICE__WSDL__LOCATION; static { URL url = null; try { url = new URL("http://localhost:9999/ws/hello?wsdl"); } catch (MalformedURLException e) { e.printStackTrace(); } HELLOWORLDIMPLSERVICE__WSDL__LOCATION = url; } public HelloWorldImplService(URL wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } public HelloWorldImplService() { super(HELLOWORLDIMPLSERVICE__WSDL__LOCATION, new QName("http://ws.mkyong.com/", "HelloWorldImplService")); } /** ** ** ** @return ** returns HelloWorld ** / @WebEndpoint(name = "HelloWorldImplPort") public HelloWorld getHelloWorldImplPort() { return (HelloWorld)super.getPort( new QName("http://ws.mkyong.com/", "HelloWorldImplPort"), HelloWorld.class); } /** ** ** ** @param features ** A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. ** Supported features not in the <code>features</code> parameter will have their default values. ** @return ** returns HelloWorld ** / @WebEndpoint(name = "HelloWorldImplPort") public HelloWorld getHelloWorldImplPort(WebServiceFeature... features) { return (HelloWorld)super.getPort( new QName("http://ws.mkyong.com/", "HelloWorldImplPort"), HelloWorld.class, features); } }
Erstellen Sie nun einen Java-Webdienst-Client, der von den oben generierten Dateien abhängt.
package com.mkyong.client; import com.mkyong.ws.HelloWorld; import com.mkyong.ws.HelloWorldImplService; public class HelloWorldClient{ public static void main(String[]args) { HelloWorldImplService helloService = new HelloWorldImplService(); HelloWorld hello = helloService.getHelloWorldImplPort(); System.out.println(hello.getHelloWorldAsString("mkyong")); } }
Hier ist die Ausgabe
Hello World JAX-WS mkyong
3. Ruby Web Service Client
Oft ist die Web-Service-Entwicklung mit anderen Programmiersprachen gemischt. Hier ist ein Beispiel für einen Ruby-Web-Service-Client, mit dem auf den veröffentlichten JAX-WS-Service
# package for SOAP-based services require 'soap/wsdlDriver' wsdl__url = 'http://localhost:9999/ws/hello?wsdl' service = SOAP::WSDLDriverFactory.new(wsdl__url).create__rpc__driver # Invoke service operations. data1 = service.getHelloWorldAsString('mkyong') # Output results. puts "getHelloWorldAsString : #{data1}"
Ausgabe
getHelloWorldAsString : Hello World JAX-WS mkyong
Verfolgung des SOAP-Verkehrs
Zeigt von oben nach unten, wie der SOAP-Umschlag zwischen Client und Server übertragen wird. Wiederholen Sie den ersten Web-Service-Client Nr. 1:
URL url = new URL("http://localhost:9999/ws/hello?wsdl"); QName qname = new QName("http://ws.mkyong.com/", "HelloWorldImplService"); Service service = Service.create(url, qname); HelloWorld hello = service.getPort(HelloWorld.class); System.out.println(hello.getHelloWorldAsString("mkyong"));
-
Hinweis ** Die Überwachung des SOAP-Verkehrs ist sehr einfach. Weitere Informationen hierzu finden Sie in diesem Handbuch - „ SOAP-Nachricht in Eclipse verfolgen IDE “.
1. Fordern Sie eine WSDL-Datei an
Zuerst sendet der Client eine wsdl-Anforderung an den Serviceendpunkt.
-
Client senden Anfrage: **
GET/ws/hello?wsdl HTTP/1.1 User-Agent: Java/1.6.0__13 Host: localhost:9999 Accept: text/html, image/gif, image/jpeg, ** ; q=.2, ** /** ; q=.2 Connection: keep-alive
-
Server Antwort senden: **
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml;charset=utf-8 <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.mkyong.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.mkyong.com/" name="HelloWorldImplService"> <types></types> <message name="getHelloWorldAsString"> <part name="arg0" type="xsd:string"></part> </message> <message name="getHelloWorldAsStringResponse"> <part name="return" type="xsd:string"></part> </message> <portType name="HelloWorld"> <operation name="getHelloWorldAsString" parameterOrder="arg0"> <input message="tns:getHelloWorldAsString"></input> <output message="tns:getHelloWorldAsStringResponse"></output> </operation> </portType> <binding name="HelloWorldImplPortBinding" type="tns:HelloWorld"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"></soap:binding> <operation name="getHelloWorldAsString"> <soap:operation soapAction=""></soap:operation> <input> <soap:body use="literal" namespace="http://ws.mkyong.com/"></soap:body> </input> <output> <soap:body use="literal" namespace="http://ws.mkyong.com/"></soap:body> </output> </operation> </binding> <service name="HelloWorldImplService"> <port name="HelloWorldImplPort" binding="tns:HelloWorldImplPortBinding"> <soap:address location="http://localhost:9999/ws/hello"></soap:address> </port> </service> </definitions>
2. hello.getHelloWorldAsString ()
Bei einem zweiten Aufruf, einer Client-Put-Methode, wird die Anforderung in einem SOAP-Umschlag aufgerufen und an den Serviceendpunkt gesendet. Rufen Sie am Serviceendpunkt die angeforderte Methode auf, legen Sie das Ergebnis in einen SOAP-Umschlag und senden Sie es an den Client zurück.
-
Client senden Anfrage: **
POST/ws/hello HTTP/1.1 SOAPAction: "" Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, ** ; q=.2, ** /** ; q=.2 Content-Type: text/xml; charset=utf-8 User-Agent: Java/1.6.0__13 Host: localhost:9999 Connection: keep-alive Content-Length: 224 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:getHelloWorldAsString xmlns:ns2="http://ws.mkyong.com/"> <arg0>mkyong</arg0> </ns2:getHelloWorldAsString> </S:Body> </S:Envelope>
-
Server Antwort senden: **
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml; charset=utf-8 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:getHelloWorldAsStringResponse xmlns:ns2="http://ws.mkyong.com/"> <return>Hello World JAX-WS mkyong</return> </ns2:getHelloWorldAsStringResponse> </S:Body> </S:Envelope>
Fertig, alle Kommentare sind dankbar.
Quellcode herunterladen
Download - JAX-WS-HelloWorld-RPC-Example.zip (14KB)