Javaプログラムで、あるWebページにアクセスし、その内容を取得する方法として、java.net.URL#openStreamメソッドの利用があります。しかし、この方法には以下の問題があります。
こうしたことは、単純なWebページの取得だけなら問題にはなりません。しかし、ブラウザの種類(HTTPのUSER_AGENTヘッダの値)によって取得内容を変化させるようなWebページにアクセスし、特定のWebブラウザがアクセスしたときと同様の結果を取得したり、POSTメソッドによって入力データを送信するFORM入力の動作をエミュレートできません。
これらの問題は、java.net.URLConnectionクラスを利用すれば解決することができます。java.net.URLConnectionクラスのオブジェクトは、java.net.URL#openConnectionメソッドにより取得されます。
HTTPヘッダをセットするには、java.net.URLConnection#setRequestProperty(String key, String value)メソッドを用い、keyにヘッダ名を、valueに内容をセットします。
POSTを行う場合は、以下の処理を行います。
java.net.URLConnectionクラスを用いて、いくつかのHTTPヘッダをセットして、POSTメソッドによりデータを送信し、POST後にサーバから送られるデータを取得するサンプルプログラムを以下に示します。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class WWWGet {
public static void main(String[] args) {
String urlString = "http://localhost:8080/jsp-examples/post.jsp";
try {
URL url = new URL(urlString);
URLConnection uc = url.openConnection();
uc.setDoOutput(true);//POST可能にする
uc.setRequestProperty("User-Agent", "@IT java-tips URLConnection");// ヘッダを設定
uc.setRequestProperty("Accept-Language", "ja");// ヘッダを設定
OutputStream os = uc.getOutputStream();//POST用のOutputStreamを取得
String postStr = "foo1=bar1&foo2=bar2";//POSTするデータ
PrintStream ps = new PrintStream(os);
ps.print(postStr);//データをPOSTする
ps.close();
InputStream is = uc.getInputStream();//POSTした結果を取得
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String s;
while ((s = reader.readLine()) != null) {
System.out.println(s);
}
reader.close();
} catch (MalformedURLException e) {
System.err.println("Invalid URL format: " + urlString);
System.exit(-1);
} catch (IOException e) {
System.err.println("Can't connect to " + urlString);
System.exit(-1);
}
}
}
このサンプルのアクセス先URLであるhttp://localhost:8080/jsp-examples/post.jspは、以下のような、単にHTTPヘッダとPOSTされた内容を表示するものであるとします。
<%@ page contentType="text/html; charset=Windows-31J" %>
<%
String agent = request.getHeader("User-Agent");
String lang = request.getHeader("Accept-Language");
String foo1 = request.getParameter("foo1");
String foo2 = request.getParameter("foo2");
%>
<html>
<head>
<title>result</title>
</head>
<body>
User-Agent=<%=agent%>
Accept-Language=<%=lang%>
foo1=<%=foo1%>
foo2=<%=foo2%>
</body>
</html>
先ほどのサンプルプログラムを実行すると、結果は以下のようになります。この実行結果から、セットしたHTTPヘッダと、POSTメソッドにより送信された内容がサーバに送られ、サーバ側で取得できていることが確認できます。
<html> <head> <title>result</title> </head> <body> User-Agent=@IT java-tips URLConnection Accept-Language=ja foo1=bar1 foo2=bar2 </body> </html>
Copyright © ITmedia, Inc. All Rights Reserved.