第4回目は、
ツールの紹介(UNIXコマンドラインcURL)
最も簡単にAtomPubを試していただける手段の一つとして、
cURLの使い方簡単にを以下に記述します。
[Usage]:curl [otions...] <url>
options | 説明 |
---|---|
-X <command> | HTTPメソッドの設定 例:-X POST) |
--data-binary <data> | POST,PUTするバイナリデータの設定 例:--data-binary @ntt. |
-H | HTTPヘッダーの設定 例:-H Content-Type:image/ |
※1:ファイル名の前に"@"を付けること
cURLによるサービス文書の取得
それでは、
サイト名 | サービス文書URI | 備考 |
---|---|---|
APP Test Site | http:// apptestsite/ ;service_ | 【作者】 projects/ |
Perl Atompub test site | http:// service | 【作者】 b/ |
Mixi Station API | 足跡:http:// 新着:http:// フォト:http:// | 【作者】 |
今回は接続先をAtomPubの提唱者であり、
[dsakano@test $ curl -x GET "http://bitworking.org/projects/apptestsite/app.cgi/service/;serv ice_document" <?xml version="1.0" encoding="utf-8"?> <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>AtomPub Test Site</atom:title> /*中略*/ <collection href="media/"> <atom:title>media</atom:title> <accept>*/*</accept> <categories fixed="yes" /> </collection> /*中略*/ </workspace> </service>
レスポンスとして返ってきたサービス文書を見ると、
- "AtomPub Test Site" というワークスペースがあること
- "AtomPub Test Site"の中に"media"というコレクションがあること
- "media"のコレクションURIはhttp://
bitworking. であることorg/ projects/ apptestsite/ app. cgi/ service/ media - "media"に対するPOSTで許可されているのは"*/*"つまり、
全てのファイル形式であること
cURLによるコレクションに新メンバーを追加
どのようなコレクションがあるかわかったところで、
[dsakano@test$ curl -H Content-Type:image/jpeg --data-binary @feed-red.jpg -X POST "http://bitworking.org/projects/apptestsite/app.cgi/service/media" <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"> <title /> <link href="http://bitworking.org/news/414/" /> <id>http://bitworking.org/news/414/</id> /*中略*/ <link href="414/" rel="edit" /> <link href="414/;media" rel="edit-media" /> <content src="http://bitworking.org/images/dev/414-.jpe" type="image/jpeg" /> </entry>
cURLによるメンバーの更新、削除
このAtomエントリからは次の情報が得られます。
- エントリーリソース:
http://bitworking. org/ projects/ apptestsite/ app. cgi/ service/ media/ 414/ - メディアリソース:
http://bitworking. org/ projects/ apptestsite/ app. cgi/ service/ media/ 414/;media
上記二つのURIを利用することでこのメンバーを操作することができます。例えば、
このように、
AtomPubクライアント実装
前述のとおり、
AtomPubの実装要件
AtomPubはHTTPメソッドのGET、
- HTTP
(HTTPS) に対応していること - HTTP
(HTTPS) のヘッダーを編集できること - HTTP
(HTTPS) メソッドのうち、 GET、 POST、 PUT、 DELETEに対応していること
これらを満たすものはPerl、
モバイルアプリ開発環境におけるAtomPub対応状況
前述のとおり、
環境 | 説明 | 標準ライブラリ利用によるヘッダーの編集 | 標準ライブラリ利用によるPUT、 |
---|---|---|---|
J2ME(DoJa5. | Sunmicrosystems提供の携帯端末用Javaプラットフォーム、 | × | × |
J2ME(MIDP2. | Sunmicrosystems提供の携帯端末用Javaプラットフォーム,au,SoftBank,WILLCOMが採用 | ○ | × |
FlashLite2. | Adobe提供の携帯端末用のFlashプラットフォーム,au,SoftBankが採用 | ○ | × |
FlashLite3. | Adobe提供の携帯端末用のFlashプラットフォーム,DoCoMoが採用 | ○ | × |
BREW3. | Qualcommが提供している携帯端末用C++プラットフォーム,auが採用 | ○ | × |
Android | Google提供の携帯端末用Javaプラットフォーム | ○ | ○ |
.NET Compact Framework2. | Microsoft提供の携帯端末用フレームワーク、 | ○ | ○ |
このように残念ながら携帯端末とAtomPubは相性がいいとは言えません。しかし携帯端末の性能は緩やかながらも向上していますし、
次は、
J2SEによる実装
J2SEにおいてHTTP通信を行うための手段はSocketクラスをはじめ、
- ①.URI
(URL) の設定 - ②.コネクションのオープン
- ③.HTTPリクエストヘッダーの設定
- ④.POST、
PUTの場合はアウトプットストリームの作成 - ⑤.URI
(URL) へ接続 - ⑥.HTTPレスポンスコードを得る
- ⑦.HTTPレスポンスヘッダーを得る
- ⑧.HTTPレスポンスボディを得る
(ある場合に限る) - ⑨.XMLのDOM化、
DOMの処理 - ⑩.①へ戻る
と見ていただいてわかるように、
①.URI(URL)の設定、②.コネクションのオープン(リスト1)
まず、
//リスト1
URL url =new URL(String);
HttpURLConnection con=(HttpURLConnection)url.openConnection();
/*リスト2
URI uri =new URI(String);
HttpURLConnection con=(HttpURLConnection)uri.toURL().openConnection();
*/
③.HTTPリクエストヘッダーの設定(リスト3)
リクエストヘッダーの設定を行います。POSTやPUTであれば、
//リスト3
con.setRequestProperty("Content-Type", "image/jpeg");
/*ベーシック認証を使う場合
con.setRequestProperty("Authorization",makeBasic(ID,PASSWD);
*/
//中略
//リスト4 ベーシック認証
private String makeBasic(String id, String pass){
String basic=id+":"+pass;
basic = "Basic "+new String(Base64.encode(basic.getBytes()));
return basic;
}
④.POST、PUTの場合はアウトプットストリームの作成(リスト5)
POSTやPUTの場合、
//リスト5
//POST(PUT)可能にします
con.setDoOutput(true);
///POST(PUT)用のOutputStreamを取得
os = con.getOutputStream();
次に、
//リスト6
//Fileの場合
InputStream fdata = new FileInputStream(File);
byte[] buffer = new byte[8192];
int rsize;
while ((rsize = fdata.read(buffer)) != -1) {
os.write(buffer, 0, rsize);
}
/*Stringの場合
os.write(String.getBytes());
*/
⑤.URI(URL)へ接続、⑥.HTTPレスポンスコードを得る、⑦.HTTPレスポンスヘッダーを得る(リスト7)
指定したURLへリクエストを送るためにHttpURLConnection.
//リスト7
//接続
con.connect();
//レスポンスコードを得る
System.out.print("Response Code["+con.getResponseCode()+"]");
System.out.println(":"+"Response Message["+con.getResponseMessage()+"]");
//レスポンスヘッダー
Map headers = con.getHeaderFields();
Iterator it = headers.keySet().iterator();
System.out.println("Response Header");
while(it.hasNext()){
String key=(String)it.next();
System.out.println(" "+key+" : "+headers.get(key));
}
※AtomPubで使われている主なレスポンスコードを示します。これ以外はRFC2616を参照してください。
レスポンスコード | 意味 | メソッド:補足 |
---|---|---|
200 | Ok | GET,PUT,DELETE:成功時 |
201 | Created | POST:成功時 |
304 | Not modified | GET:修正できないメンバー |
415 | Unsupported Media Type | POST:サポート外のメディアタイプ |
⑧.HTTPレスポンスボディを得る(ある場合に限る)(リスト8)
GET、
//リスト8
// DOM化
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilde db = dbf.newDocumentBuilder();
Document doc = db.parse(con.getInputStream());
/* String化
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
System.out.println("ResponseBody");
while((line = inputreader.readLine())!= null){
System.out.println(line);
}
*/
⑨.XMLのDOM化、DOMの処理
次は、

JTreeはDefaultMutableTreeNodeを引数とするコンストラクタを持っているので、
//リスト9
//rootノードの作成
Node rootTag = doc.getDocumentElement();
DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootTag.getNodeName());
//rootから前順序で再帰的にdocを辿る
addChildren(rootTag, root);
//Tree作成
JTree tree = new JTree(root);
//中略
private void addChildren(Node node, DefaultMutableTreeNode branch) {
//branchに対して子ノードをaddする
NodeList list = node.getChildNodes();
//子ノードのうちアトリビュートノードだけを処理する
NamedNodeMap attributes = node.getAttributes();
for(int i=0; i<attributes.getLength(); i++){
DefaultMutableTreeNode att = new DefaultMutableTreeNode( attributes.item(i));
branch.add(att);
}
//子ノードのうちエレメントノードとテキストノードを処理する
for( int i=0; i<list.getLength(); i++ ) {
Node child = list.item( i );
if(/*テキストノードならば*/){
//テキストノードの処理
continue;
}
//エレメントノードの処理
DefaultMutableTreeNode tn = new DefaultMutableTreeNode( child.getNodeName());
branch.add( tn );
//追加したエレメントノードをルートとして再帰的にツリーを構成
addChildren(child,tn);
}
}
これでDOMからJteeに変換することができました。これに加えてイベント処理系を利用することで、
//リスト10
try{
ByteArrayOutputStream bufferStream = new ByteArrayOutputStream();
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tr = tff.newTransformer();
tr.transform(new DOMSource(document), new StreamResult(bufferStream));
String st=bufferStream.toString("UTF-8");
}catch(Exception e){}
AtomPubクライアントの紹介
最後に、
- APP Test Client
- 本稿で使わせてもらったJoeGregorioさんのAPP Test Siteのクライアントバージョンです。
- the Ape
- IETFのAtomPubワーキングループで議長を務めているTimBrayさんのクライアントです。ブラウザから使えます。
- Atomic
- AtomicはAtomPubを利用するためのFireFox用プラグインです。REST型のアプリケーションを開発するためのJava軽量フレームワーク"Restlet"を利用したAtomPubクライアント&サーバープロジェクト"atomojo"の一環で作成されました。このプラグインはまだ未実装な機能も多いですが、
作者のAlex Milowskiさんが勢威製作中のようなので今後に期待です。 - MobileAtomJ2ME
- MobileAtomはJ2MEによる携帯アプリのAtomPubクライアントの実装です。2004年ごろのAtomPubの仕様をもとに作成されたものなので、
HTTPメソッドのPUTとDELETEに対応するために、 RFCでは認められていないSOAPを一部利用しています。しかし、 ソースそのものは実装するときに参考になります。 - Atomic
- ウィザシステムの丸本さんのクライアントソフトです。和製ソフトでは一番有名かもしれません。
まとめ
最終回はAtomPubを試すと銘うって、
また、
最後に、