JavaのRESTful(JAX-RS)実装であるjerseyの中身をみていることにした。
というのも、あのPathパラメータの実装が欲しいと思ったからです。

具体的には、JAX-RSの仕様では

@Path("/customer/{first}-{last}")
public void foo(
  @PathParam("first") String firstName, 
  @PathParam("last") String lastName){
}

という表記をすると、
http://xxxxxx/customer/shinnosuke-nohara
のようなURLにアクセスしたときに、
foo(“shinnosuke”,”nohara”)
のメソッドを自動的に起動できる。

ドキュメントチックにRESTのURLのパターン仕様が記述できるので、
ある意味、わかりやすい。

このような仕様を今度作成するnettyで実現するRESTにも部分的に取り込もうと思う。
そこで、Jerseyではこの部分をどのようにやっているのかをみて、
まずはそこだけ借りてしまおうということです。

で、調べたのが、
com.sun.jersey.api.uri.UriTemplate
というクラス。これで、URLの正規表現と実際のパスからパラメータを抜き出すことができます。

では簡単な例。

public class PathPatternSample {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		checkPath("/foo/{arg1}/{arg2}/{num:[0-9]{3}}","/foo/test1/test2/999");
		checkPath("/customer/{firstname}-{lastname}","/customer/shinnosuke-nohara");
	}
	
	public static void checkPath(String path,String input){
		UriTemplate template = new UriTemplate(path);
		Map<string , String> values = new HashMap</string><string , String>();
		System.out.println("======>" + template.getTemplate() + "< ======");
		if(template.match(input, values)){
			for(String key: values.keySet()){
				System.out.println(key + "=>[" + values.get(key) + "]");
			}
		}
	}
}

これで、実行結果は

======>/foo/{arg1}/{arg2}/{num:[0-9]{3}}< ======
num=>[999]
arg2=>[test2]
arg1=>[test1]
======>/customer/{firstname}-{lastname}< ======
lastname=>[nohara]
firstname=>[shinnosuke]

となります。

これで、javaのアノテーションと組み合わせれば、
まずは完成といったところです。

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2011年12月
« 11月   1月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ