JAX-WS 補足

Download Report

Transcript JAX-WS 補足

Webサービス II (第7回)
http://www.wakhok.ac.jp/~tatsuo/ws2/
2006年11月8日
植田龍男
JAX-WS




新しい Webサービスの枠組み
じゃ、古い Webサービスって?
JAX-RPC 1.0
JAX-RPC 2.0 = JAX-WS 2.0
JAXB を利用して実現
Webサービスのアノテーションの導入
クライアントプログラムの作成(1)


自動生成ツール wsimport
wsimport HelloService.wsdl
wsimport http://localhost/Service?wsdl
HelloImpl.class, HelloServiceImpl.class,
ObjectFactory.class
SayHello.class, SayHelloResponse.class
クライアントプログラムの作成(2)
public class HelloClient {
public static void main ( String[] args ) {
HelloImpl port = new
HelloImplService().getHelloImplPort();
String message
=port.sayHello( "Tatsuo" );
System.out.printf ( message );
JAX-WSの補足




REST(Representational State Transfer)
HTTP で XMLのデータなどを交換するスタ
イルのWebサービス
SOAP(XML-RPC) vs. REST ??
JAX-WS は JAX-RPC の後継だが RESTに
も対応可能 – JAXB がベース
サービス固有のXML Java のクラス
JAX-WS のAPI



javax.jws パッケージ
@WebService, @WebMethod などのア
ノテーション
javax.jws.soap パッケージ
@SOAPBinding などアノテーション
javax.xml.ws パッケージとサブパッケー
ジ群
javax.xml.ws パッケージ


Service クラス
Serviceのインナクラス
enum ServiceMode
ServiceMode.MESSAGE
ServiceMode.PAYLOAD
Provider, Dispatch, Response などのイン
タフェース群
JAX-WS for REST の現状
一部の仕様が流動的(?)
 バグ有り(?)
 情報も少ない
 参照)
Marc Hadley氏のブログ
http://weblogs.java.net/blog/mhadley/arc
hive/2006/03/restful_web_ser_1.html

サンプル(Yahoo News検索)
Yahoo News Search の API
http://developer.yahoo.com/search/news/
V1/newsSearch.html
 XML Schema も公開
http://api.search.yahoo.com/NewsSearch
Service/V1/NewsSearchResponse.xsd

サンプル実行までの手順
スキーマから xjc でJavaのソースを生成
(この時、一部手を入れる必要あり)
 生成されたソースのコンパイル
 クライアントのサンプル作成とコンパイル
 実行

xjc と生成されるソース


xjc NewsSearchResponse.xsd
yahoo/yp 以下に
ResultSet.java, ResultType.java,
ImageType.java
ObjectFactory.java, package-info.java
ちょっと修正が必要?
Yahoo/yn/ResultSet.java
@XmlRootElement(name = “ResultSet”)
public class ResultSet {
@XmlRootElement(name = "ResultSet",
namespace = "urn:yahoo:yn")
サンプルソース(1)
URI nsURI = new URI("urn:yahoo:yn");
QName serviceName = new
QName("yahoo",nsURI.toString());
QName portName = new
QName("yahoo_port",nsURI.toString());
Service s = Service.create(serviceName);
サンプルソース(2)
URI address = new URI("http", null,
"api.search.yahoo.com", 80,
"/NewsSearchService/V1/newsSearch",
"appid=jaxws_restful_sample&type=all&
results=10&sort=date&query=Japan“
,null);
s.addPort(portName, HTTPBinding.HTTP_BINDING,
address.toString());
サンプルソース(3)
Dispatch<Object> d
= s.createDispatch(portName, jbc,
Service.Mode.PAYLOAD);
Map<String, Object> requestContext =
d.getRequestContext();
requestContext.put(
MessageContext.HTTP_REQUEST_METHOD,
"GET");
StreamSource ss =
(StreamSource)d.invoke(null);
サンプルのソース(4)
JAXBContext jbc =
JAXBContext.newInstance( "yahoo.yn" );
Unmarshaller u = jbc.createUnmarshaller();
ResultSet rs = (ResultSet)u.unmarshal(ss);
for (ResultType r: rs.getResult()) {
System.out.println(
r.getTitle() + “ “ + r.getClickUrl() );
}
ビルドファイル(build.xml) その1
<target name="compile">
<javac destdir="." debug="on">
<src path="." />
<classpath refid=“classpath” />
</javac>
</target>
ビルドファイル(build.xml) その2
<target name="run" depends="compile">
<java classname="YahooNewsTest"
fork="true">
<classpath refid="classpath" />
</java>
</target>