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("https://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("https://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("https://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)