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)