奥さん、HttpClient が便利すぎます

4年ぶりにJavaでネットワークプログラミング。

はじめは java.net.Socket か java.net.HttpURLConnection クラスで実装しようと思っていたけど、commons にて HttpClient を発見。使ってみたら、スゲー便利。そうそう、こういうのを探してました!

Jakarta Commons - HTTP Client

ダウンロードするときは、パッケージ依存している commons-logging と commons-codecs もご一緒にどうぞ。

早速トライアルということで、POSTメソッドでIDとパスワードを送ってログインするプログラムを、Socket、HttpURLConnection、HttpClient の3つのバージョンで書いてみた。

まず、Socket の場合。あ、try ~ catch とかは省略してますんでご注意を。

String host = "localhost";
String path = "/Login.do";
String param = "id=test&pass=test";
int port = 80;

String line; Socket socket; BufferedReader reader; BufferedWriter writer;
socket = new Socket(host, port); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write("POST " + path + " HTTP/1.1\r\n"); writer.write("Host: " + host + ":" + port + "\r\n"); writer.write("Content-type: application/x-www-form-urlencoded\r\n"); writer.write("Content-length: " + param.getBytes().length + "\r\n\r\n"); writer.write(writer + "\r\n"); writer.flush();
while ((line = reader.readLine()) != null) { System.out.println(line); }
reader.close(); writer.close(); socket.close();

続いて、HttpURLConnection の場合。

String line;
URL url = new URL("http://localhost/Login.do");
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
uc.setRequestMethod("POST");
uc.setRequestProperty("Accept-Language", "ja");
uc.setDoOutput(true);

PrintWriter writer; BufferedReader reader;
writer = new PrintWriter(uc.getOutputStream()); writer.print("id=test&pass=test"); writer.close();
reader = new BufferedReader(new InputStreamReader(uc.getInputStream())); while ((line = reader.readLine()) != null) { System.out.println(line); }
reader.close(); uc.disconnect();

そして、HttpClient の登場。

String line;
PostMethod method;
BufferedReader reader;

String url = "http://localhost/Login.do"; HttpClient httpclient = new HttpClient();
method = new PostMethod(url); method.addParameter("id", "test"); method.addParameter("pass", "test"); int status = httpclient.executeMethod(method);
reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream())); while ((line = reader.readLine()) != null) { System.out.println(line); }
reader.close(); method.releaseConnection();

HttpClient では、ヘッダーやパラメータをごにょごにょすることに気を使うことが減って、見通しが良いし、コーディングもしやすい。このくらい簡単な例だとアレですが、他にも色々と細かいことができるので、かなりオススメできますよ、これは。

ちなみに、今後は HttpComponents に組み入れられて開発されていくみたい。HttpCore がベータになったら、そっちも触ってみたいな。

以上、お疲れさまでした。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/410