I will be waiting for your knock ever after from today.


Visards, Inc.

Java Sticky Note

java
  ・JSTL
  ・Commons Net
  ・Apache
  ・Tomcat
  ・James
  ・Jetspeed
  ・POI
  ・Jexl
  ・Jelly
  ・Blojsom
  ・eclipse

link
  ・James

author
  ・profile

Commons  
<< prev | Index | next >>
Jakarta Commonsによるネットワークプログラミング

mixiチェック

6. HTTP
次は,HTTPのクライアントです. HTTPは,ご存知の通りWeb上でHTML等の送受 信に広く使われているプロトコルです.現在では,単 純なファイルや画像のやり取りだけではなく,Webサ ービスなどの高度なサービスもHTTP上に実装されて います.
HTTPの大きな特徴は,プロトコルの単純さです. その単純さを実現している大きな要素の1つが,ステ ートレスという点です.HTTPでは,基本的にデータ の送受信は1回ごとに独立して実行されます.
しかし,ステートレスなHTTPプロトコルを使用し ながら,セッション情報などの状態を維持する仕組み が実際には用意されています.Cookieは,一度設定 されるとその設定された範囲内でのアクセスに対し, 異なるリクエストであっても同一情報を維持したまま 通信が行われます.認証情報なども同様です.この仕 組みにより,ステートレスなHTTPプロトコル上でア プリケーションは状態管理を行うことが可能となって います.

6.1 HttpClient概要
ご存知の通り,Javaの標準ライブラリにもHTTPク ライアントのライブラリが,java.netパッケージにあ ります.しかし,java.netパッケージにおけるHTTP の機能(HttpURLConnectionクラス等)は,低レベ ルなネットワーク処理は隠蔽されており,アプリケー ションから細かな制御を行うことができず,また Cookieや認証処理等に必要な高レベルな機能も提供 されていません.このためjava.netパッケージでは,高 度なHTTPクライアントを実装するのは困難となって います.
HttpClientでは,Cookieや認証に関する処理がク ラスライブラリとして提供されており,またタイムア ウト設定注1などネットワークレベルの処理も可能で, 高機能なHTTPクライアントの実装に欠かせないさま ざまな機能が提供されています.HttpClientは,クラ イアント機能の実装にjava.net.HttpURLConnection等 は使用せず,Socketレベルから独自にPureJavaで実 装されています.また,本稿では使用しませんが, Java標準ライブラリのHttpURLConnectionクラスを 容易にHttpClientに置き換えられるようにするための ラッパークラスも提供されています.
以下にHttpClientの特徴を示します.
    ・HTTP 1.0,1.1に準拠
    ・PureJavaによる実装
    ・HTTPSをサポート
    ・Cookie,認証処理のサポート
    ・KeepAliveが使用可能
    ・PureJavaでタイムアウトの制御が可能
    ・GET,POST だけでなく,DELETE,PUTなどのメソッドにも対応
    ・Java.net.HttpURLConnectionを置き換えるためのクラスを提供
    ・リダイレクト処理の制御が可能
6.2 HTTP サンプルプログラムの動作
本サンプルは,特定メンバー向けに用意されたWeb ページ(トップページと,インフォメーションページ の2ページ)にアクセスする例です.このサイトのメ ンバー向けページは,フォーム認証を通過しないと取 得できない構造となっています.
ブラウザからこの処理を実行する場合には,次のよ うな流れとなります(図4).

    図4 ページ構成


(1) ユーザは,トップページのURLにアクセスする
(2) ブラウザ上には,認証ページが表示される
(3) 認証ページ上にユーザID とパスワードを入力して送信する
(4) ブラウザ上にトップページが表示される(この段階で,認証の ためのセッション情報が,Cookieとしてブラウザに設定されます)
(5) ユーザが同サイト内のインフォメーションページ にアクセスする(上記fで設定されたCookieを 維持したままリクエストが送信されます)
(6)インフォメーションページがブラウザ上に表示さ れる


一方,Javaによるサンプルプログラムの場合,次の 流れになります(リスト3).

(1) ユーザID,パスワードを設定し,トップページの URLにアクセスする
(2)サーバからトップページを取得する(この段階で, 認証のためのCookieを取得します)
(3)クライアントはサーバにインフォメーションペー ジを要求する(上記sで設定されたCookieを維 持したままリクエストを送信します)
(4) インフォメーションページを取得する

プログラムでは,認証とトップページの取得が1回 のリクエストで処理されるため,ブラウザを使用する 場合と比べて,送受信の回数が1回減っている点に注 意してください(ログインページは取得しません).

6.3 プログラムの説明
ここでは,HTTPプロトコルの詳細については説明 しません.HTTPプロトコル上の基本認証やCookie の仕組みが理解できている前提で記述しています. HTTPプロトコルの仕組みは,インターネットでも多 くの情報を得ることができますので,理解されていな い方は調べてみてください.

リスト3
 1  import org.apache.commons.httpclient.*;
 2  import org.apache.commons.httpclient.cookie.*;
 3  import org.apache.commons.httpclient.methods.*;
 4  
 5  public class HTTPSample {
 6  
 7      public static void main(String[] arg) throws Exception {
 8  
 9          String server = "localhost";
10          int port = 80;
11  
12          // クライアントの生成
13          HttpClient client = new HttpClient();                           ←(1)
14          client.getHostConfiguration().setHost(server, port, "http");    ←(1)
15          client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);  ←(1)
16  
17          // 認証ページを通過し、トップページにアクセス
18          PostMethod top = new PostMethod( "/club/member/top.html" );     ←(2)
19          NameValuePair[] parameters = new NameValuePair[2];              ←(2)
20          parameters[0] = new NameValuePair("username", "user");          ←(2)
21          parameters[1] = new NameValuePair("password", "password");      ←(2)
22          top.setRequestBody( parameters );                               ←(2)
23  
24          client.executeMethod(top);                                      ←(3)
25          // 取得したクッキーを表示
26          Cookie[] cookies = client.getState().getCookies(server, port,   ←(3)
27              "/club", false );                                           ←(3)
28          for (int i=0; i<cookies.length; i++) {                          ←(3)
29              System.out.println(cookies[i].toString());                  ←(3)
30          }                                                               ←(3)
31          System.out.println( top.getResponseBodyAsString() );            ←(3)
32          top.releaseConnection();                                        ←(3)
33  
34          // infoページにアクセス
35          GetMethod info = new GetMethod( "/club/member/info.html" );     ←(4)
36          int status = client.executeMethod(info);                        ←(4)
37          String body = info.getResponseBodyAsString();                   ←(4)
38          System.out.println( "status: " + status + "\n");                ←(4)
39          System.out.println( body );                                     ←(4)
40          info.releaseConnection();                                       ←(4)
41      }
42  }


リスト3について以下に解説します ((1)がリスト3-(1) の部分に対応.以下同様).

(1) HttpClientのオブジェクト生成 HttpClientオブジェクトを生成します.HttpClient は,HTTPメソッドの実行などクライアント実装の中 心的な役割を果たすクラスです.
生成したクライアントに対して,サーバの情報(サ ーバ名,ポート,プロトコル)を設定します.続いて リスト3 - 15行目で,Cookieの処理方式を指示していま す.ここで,実行しているclient.getState()で取得でき るオブジェクトは,HttpStateクラスのオブジェ クトです.HttpStateは,リクエスト間でも維持される Cookieや認証情報を保持するクラスです.サンプルプ ログラムではこれ以降出てきませんが,本サンプルで も認証のためのCookie情報を維持/送信するために裏 で働いています.

(2) 認証情報の設定
サーバに送信するMethodを生成します.ここでは PostMethodを生成しています.引数は,トップペー ジのURL を示す文字列です.HttpClient では, PostMethod以外にもGetMethodやHeadMethodな どが利用できます.次に,NameValuePairクラスを 使用して,認証に使用するパラメータ(ユーザIDと パスワード)を作成し,リスト3 - 22行目で,メソッ ドに設定しています.

(3) リクエストの送受信
リクエストの送信には,HttpClientオブジェクトの executeMethod()を使用します.引数には,上記(2) で作成したPostMethodのオブジェクトを指定してい ます.この後,サンプルプログラムでは,この処理で 設定されたCookieとレスポンスを出力しています.こ こで表示されるCookieが,認証を維持するために使 われているCookieです.使用し終わったメソッドは, releaseConnection()で後始末します.

(4) 次リクエストの送信
インフォメーションページも,認証領域の中のペー ジであり,認証情報を維持していないと,ページを取 得することはできません.上記eで取得したCookie を使用して,次のインフォメーションページを取得し ます.インフォメーションページは,GetMethodで取 得しています.ご覧の通り,特別な処理は行っていま せんが,認証を維持するためのCookieがサーバに送 信され,インフォメーションページが取得されます.





 << prev  ↑index  next >>


このドキュメントに関するご意見、ご要望などはまで。


Copyright (C) 2003-2005 Visards, Inc. All Rights Reserved.