Restletとは?
Restlet(http://
JavaのREST APIといえば、
なぜRestletという名称なのかについて、
RestletによるRESTアプリケーション
REST自体のことについては、
Restlet restlet = new Restlet() {
@Override
public void handle( Request request, Response response ) {
response.setEntity(
new StringRepresentation(
"はじめてのRestlet", MediaType.TEXT_PLAIN,
new Language( "ja" ), new CharacterSet( "Shift_JIS" )
)
);
}
};
表示領域の関係でネストが深くなっていますが、
RestletによるRESTアプリケーションは、
レスポンスとして返すデータはResponse#setEntity()メソッドで設定します。日本語を含まない半角テキスト(ASCIIコード)であれば、
レスポンスには、
サーバの設定と起動
RESTアプリケーションは、
Server server = new Server( Protocol.HTTP, 8888, restlet );
server.start();
Serverクラスのコンストラクタには、
ここでは1つのRESTアプリケーションのみを設定していますが、
クライアントアプリケーションによるアクセス
サーバを起動できたら、

ただRESTアプリケーションの構築は、
Client client = new Client( Protocol.HTTP );
Response res = client.get( "http://localhost:8888/" );
System.out.println( res.getEntity().getText() );
リスト3のClientクラスが、
もしRestletを使わない場合は、
このクラスのget()メソッドがHTTPのGETに対応し、
リスト3のロジックを起動してサーバにアクセスするには、
このように、
POSTメソッドの実行
POSTメソッドの実行
これまでは、
そこで、
リスト4はクライアントアプリケーションの例です。投稿するデータは、
POSTメソッドの実行は、
// 投稿するデータ(パラメータ)をフォームに追加
Form form = new Form();
form.add( "a", "パラメータ1" );
form.add( "b", "パラメータ2" );
// クライアントを準備する
Client client = new Client( Protocol.HTTP );
String url = "http://localhost:8888/";
Representation rep = form.getWebRepresentation();
// 文字コードを指定する場合
// Representation rep = form.getWebRepresentation( new CharacterSet( "Shift_JIS" ) );
// サーバにアクセス
Response res = client.post( url, rep );
リスト5はPOSTメソッドを実行するRestletの例です。クライアントからのリクエストはFormで送信されましたので、
この例では、
Restlet restlet = new Restlet() {
@Override
public void handle( Request request, Response response ) {
// リクエストからFormを取得する
Form form = request.getEntityAsForm();
// パラメータの取得
Parameter a = form.getFirst( "a" );
Parameter b = form.getFirst( "b" );
// 直接データを取得する場合
// String a1 = form.getFirstValue( "a" );
// String b1 = form.getFirstValue( "b" );
// 複数のデータを個別に取得する場合
// String a2 = form.subList( "a" ).get(1).getValue();
// String b2 = form.subList( "b" ).get(1).getValue();
// .......... その他の処理 .....
}
};
BASIC認証を行う
データベースの参照は、
WebブラウザでBASIC認証が必要なWebサイトにアクセスすると、
リスト6がその例です。BASIC認証に関係するのはChallengeSchemeとChallengeResponseです。サーバにアクセスする前にこれらをRequestに設定した上でアクセスします。認証されたかどうかはStatusで判断します。
// BASIC認証用のリクエストを設定(ユーザ名とパスワード)
ChallengeResponse basicAuth = new ChallengeResponse(
ChallengeScheme.HTTP_BASIC, "username", "password" );
Request request = new Request( Method.GET, "http://localhost:8888/" );
request.setChallengeResponse( basicAuth );
// サーバにアクセス
Client client = new Client( Protocol.HTTP );
Response response = client.handle( request );
// アクセスできたかどうかを確認
Status status = response.getStatus();
if ( status.isSuccess() ) {
// ..... 認証された場合の処理 .....
} else if ( status.equals( Status.CLIENT_ERROR_UNAUTHORIZED ) ) {
// ..... 認証されなかった場合の処理(Status.CLIENT_ERROR_FORBIDDENが返される場合もある) .....
} else {
// ..... その他のエラーでアクセスできない場合の処理 .....
}
一方、
// RESTアプリケーション
Restlet restlet = new Restlet() {
@Override
public void handle( Request request, Response response ) {
// ..... RESTアプリケーションの処理 .....
}
};
// サーバの設定
Component component = new Component();
component.getServers().add( Protocol.HTTP, 8888 );
// BASIC認証の設定
Guard guard = new Guard( component.getContext(), ChallengeScheme.HTTP_BASIC, "An Interest Products" );
// ユーザ名とパスワード
guard.getSecrets().put( "username", "password".toCharArray() );
guard.setNext( restlet );
// サーバにアプリケーションを設定
component.getDefaultHost().attach( "", guard );
// サーバ起動
component.start();

XMLデータの取得
Web APIの実行結果はXMLデータとなる場合が多いので、
リスト8は、
こうすると、
Client client = new Client( Protocol.HTTP );
DomRepresentation rss = client.get( "http://www.pheedo.jp/f/gihyo_rss2" ).getEntityAsDom();
for( Node n : rss.getNodes( "//item/title" ) ) {
System.out.println( "タイトル = " + n.getTextContent() );
}
タイトル = 2007年6月8日 《注目》Metisse追加、開発版Video LAN更新、Wackamole/Abraca/Lens追加、PHP5更新、ほか
タイトル = 第2回 Prologをご存じですか?
タイトル = 第2回 対話を促進する学び場の運営ノウハウ[中編] 勉強会当日の進め方
.......... ほかにもいろいろなタイトルが出力される .....
Restletは、
紹介しきれないクラスはまだいろいろありますので、