http://www.wakhok.ac.jp/~tatsuo/ws2/ 2006年11月8日 植田龍男 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 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/archive/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/NewsSearchService/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>