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]ссылка://тег/веб-сервисы/[веб-сервисы]