JAX-WSはJDK 1.6にバンドルされているため、Java Webサービスの開発が容易になります。このチュートリアルでは、次のタスクの実行方法を説明します。
-
JAX-WSを使用してSOAPベースのRPCスタイルのWebサービスエンドポイントを作成します.
-
Java Webサービスクライアントを手動で作成します.
-
wsimport ツールを使用してJava Webサービスクライアントを作成します.
-
Ruby Webサービスクライアントを作成します.
JAX-WSでRPCスタイルのWebサービスを開発するのがいかに簡単かは驚きです。
JAX-WS Webサービスのエンドポイント
JAX-WSを使用してRPCスタイルのWebサービスエンドポイントを作成する方法を示す次の手順。
1. Webサービスエンドポイントインターフェイスを作成する
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. Webサービスエンドポイント実装を作成する
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.エンドポイントパブリッシャーを作成する
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.テストする
このURL「 http://localhost:9999/ws/hello?wsdl 」を使用して、生成されたWSDL(Webサービス定義言語)ドキュメントにアクセスして、デプロイされたWebサービスをテストできます。
Webサービスクライアント
OK、Webサービスが正しくデプロイされました。次に、公開されたサービスにアクセスするためのWebサービスクライアントを作成する方法を見てみましょう。
1. Java Webサービスクライアント
ツールがなければ、次のようにJava Webサービスクライアントを作成できます。
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. wsimportツールによるJava Webサービスクライアント
代わりに、 " wsimport "ツールを使用して公開されたwsdlファイルを解析し、公開されたWebサービスにアクセスするために必要なクライアントファイル(スタブ)を生成することができます。
-
wsimportはどこですか? wsimport ツールはJDKにバンドルされています。 " JDK PATH/bin__"フォルダにあります。
「 wsimport 」コマンドを発行します。
wsimport -keep http://localhost:9999/ws/hello?wsdl
必要なクライアントファイルを生成します。これは、提供されたwsdlファイルに依存します。この場合、1つのインタフェースと1つのサービス実装ファイルが生成されます。
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 Webサービスクライアントを作成します。
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サービスクライアント
多くの場合、Webサービス開発は他のプログラミング言語と混在して使用されます。そこで、公開されたJAX-WSサービスにアクセスするために使用されるRuby Webサービスクライアントの例を示します。
# 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 Webサービスクライアントをもう一度見てください:
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/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()
2番目の呼び出しでは、クライアントはメソッドを呼び出して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](14KB)