JAX-WS поставляется в комплекте с JDK 1.6, что упрощает разработку веб-сервисов Java. Из этого туториала вы узнаете, как выполнять следующие задачи:
, Создайте конечную точку веб-службы в стиле RPC на основе SOAP с помощью JAX-WS.
, Создайте клиент веб-службы Java вручную.
, Создайте клиент веб-службы Java с помощью инструмента wsimport .
, Создайте клиент веб-службы Ruby.
Вы будете удивлены, насколько просто разработать веб-сервис в стиле RPC в JAX-WS.
Конечная точка веб-службы JAX-WS
Следующие шаги показывают, как использовать JAX-WS для создания конечной точки веб-службы в стиле RPC.
1. Создайте интерфейс конечной точки веб-службы
File: 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. Создать реализацию конечной точки веб-службы
File: HelloWorldImpl.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. Создать Endpoint Publisher
File: 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());
}
}
Запустите издателя конечных точек, и ваша « hello world web service » будет развернута по URL « http://localhost : 9999/ws/hello «.
4. Проверьте это
Вы можете проверить развернутую веб-службу, обратившись к сгенерированному документу WSDL (язык определения веб-службы) по этому URL-адресу « http://localhost : 9999/ws/hello? Wsdl ».
Клиенты веб-сервисов
Хорошо, веб-служба развернута правильно, теперь давайте посмотрим, как создать клиент веб-службы для доступа к опубликованному сервису.
1. Клиент веб-службы Java
Без инструмента вы можете создать клиент веб-службы Java следующим образом:
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"));
}
}
Выход
Hello World JAX-WS mkyong
2. Клиент Java Web Service с помощью инструмента wsimport
В качестве альтернативы вы можете использовать инструмент « wsimport » для анализа опубликованного файла wsdl и создания необходимых клиентских файлов (заглушки) для доступа к опубликованному веб-сервису.
-
Где находится wsimport? Этот инструмент wsimport ** входит в комплект JDK, его можно найти в папке « JDK PATH/bin__».
Введите команду « wsimport ».
wsimport -keep http://localhost:9999/ws/hello?wsdl
Он сгенерирует необходимые клиентские файлы, которые зависят от предоставленного файла wsdl. В этом случае он сгенерирует один интерфейс и один файл реализации сервиса.
File: HelloWorld.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);
}
File: 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);
}
}
Теперь создайте клиент веб-службы Java, который зависит от созданных выше файлов.
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"));
}
}
Вот вывод
Hello World JAX-WS mkyong
3. Клиент Ruby Web Service
Зачастую разработка веб-служб смешивается с другими языками программирования. Итак, вот пример клиента веб-службы Ruby, который используется для доступа к опубликованной службе JAX-WS.
# 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}"
Выход
getHelloWorldAsString : Hello World JAX-WS mkyong
Отслеживание трафика SOAP
Сверху вниз, показывая, как конверт SOAP проходит между клиентом и сервером. Смотрите снова клиент веб-службы # 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"));
-
Примечание ** Чтобы следить за трафиком SOAP очень легко, см. Это руководство - «ссылка://webservices/jax-ws/how-to-trace-soap-message-in-eclipse-ide/[Как отслеживать SOAP-сообщение в Eclipse IDE]«.
1. Запросить файл WSDL
Во-первых, клиент отправляет запрос wsdl конечной точке службы, см. HTTP-трафик ниже:
-
Клиент отправляет запрос: **
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
-
Сервер отправляет ответ: **
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 ()
Второй вызов, клиентский метод put, вызывает запрос в конверте SOAP и отправляет его конечной точке сервиса. В конечной точке службы вызовите запрошенный метод, поместите результат в конверт SOAP и отправьте его обратно клиенту.
-
Клиент отправляет запрос: **
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>
-
Сервер отправляет ответ: **
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>
Готово, любые комментарии приветствуются.
Скачать исходный код
Загрузить его - ссылка://wp-content/uploads/2010/11/JAX-WS-HelloWorld-RPC-Example.zip[JAX-WS-HelloWorld-RPC-Example.zip](14 КБ)
ссылка://тег/hello-world/[привет мир]ссылка://тег/jax-ws/[jax-ws]ссылка://тег/веб-сервисы/[веб-сервисы]