http://www.wakhok.ac.jp/~tatsuo/ws2/ 2006年11月15日 植田龍男 Webサービス II (第8回) http://www.wakhok.ac.jp/~tatsuo/ws2/ 2006年11月15日 植田龍男
今週の Java の2大ニュース!! Java のオープンソース化が正式に発表! http://www.sun.com/software/opensource/java/ Java SE 6 がβ版ではなくなりました! JDK 6 Release Candidate http://java.sun.com/javase/downloads/ea.jsp
本日の目標(その1) Java SE 6 をインストールしよう Windows版は管理者権限が必要 (自分のノートPCなどを利用してください。) 実習室のマシンの場合 Linux で作業してください。 注意: 250Mbyte ほどの空き容量が必要
インストールの手順 Linux 用のインストールプログラム jdk-6-rc-linux-i586.bin をダウンロード (RPMの形式もあるが、これも管理者権限が必要になる) 適当なディレクトリで実行 sh jdk-6-rc-linux-i586.bin 作業したディレクトリの下に展開される jdk1.6.0/bin を PATH の先頭に追加
設定ファイルの例 .profile if [ `uname` = "Linux" ]; then PATH=~/jdk1.6.0/bin:.:$PATH export PATH fi
JAXB を使ってみよう(1) xjc, schemagen ツールの利用 JavaからXMLへ、XMLからJavaへの確認 ビルドファイルは不要 javac と java のみ!
JAXBを使ってみよう(2) RESTful な Webサービスへのアクセス これも xjc,javac と java だけでできるはず
JAX-WSの補足(前回の復習) REST(Representational State Transfer) HTTP で XMLのデータなどを交換するスタイルのWebサービス SOAP(XML-RPC) vs. REST ?? JAX-WS は JAX-RPC の後継だが RESTにも対応可能 – JAXB がベース サービス固有のXML Java のクラス
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 Image検索) Yahoo Image Search の API http://developer.yahoo.com/search/image/V1/imageSearch.html XML Schema も公開 http://search.yahooapis.com/ImageSearchService/V1/ImageSearchResponse.xsd
サンプル実行までの手順 スキーマから xjc でJavaのソースを生成 (この時、一部手を入れる必要あり? どうなったのだろう?) 生成されたソースのコンパイル(javac) クライアントのコンパイル(javac) 実行(java)
xjc と生成されるソース xjc ImageSearchResponse..xsd yahoo/srchmi 以下に ResultSet.java, ResultType.java, ThumbnailType.java ObjectFactory.java, package-info.java
ちょっと修正が必要だったが? ResultSet.java @XmlRootElement(name = “ResultSet”) public class ResultSet { @XmlRootElement(name = "ResultSet") あれ?名前空間の指定が見当たらない!
またまた仕様が変更された? 名前空間の情報は package-info.java に記述されている package-info.java @javax.xml.bind.annotation.XmlSchema( namespace = "urn:yahoo:srchmi", elementFormDefault = javax.xml.bind.annotation.XmlNsForm. QUALIFIED) package yahoo.srchmi;
サンプルソース(1) 前回と同じ URI nsURI = new URI("urn:yahoo:srchmi"); 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) JAXBContext jbc = JAXBContext.newInstance( "yahoo.yn" ); Dispatch<Object> d = s.createDispatch(portName, jbc, Service.Mode.PAYLOAD); Map<String, Object> requestContext = d.getRequestContext(); requestContext.put( MessageContext.HTTP_REQUEST_METHOD, "GET");
サンプルのソース(4) 前回は StreamSource ss = (StreamSource)d.invoke(null); Unmarshaller u = jbc.createUnmarshaller(); ResultSet rs = (ResultSet)u.unmarshal(ss);
サンプルのソース(4) 今回は ResultSet rs = (ResultSet)d.invoke(null); for (ResultType r: rs.getResult()) { System.out.println( r.getTitle() + “ “ + r.getClickUrl() ); } かなり簡略化された仕様に変更
ビルドファイルはいりません xjc ImageSearchResponse.xsd javac yahoo/srchmi/*.java javac YahooImageTest.java java YahooImageTest
通常のWebサービスも簡単に ただし、サーバとの互換性が・・・ サーバの側も新しい仕様にしましょう Linux 用の最新の GlassFish で試す? (これは次回に)