Javaプログラムで、あるWebページにアクセスし、その内容を取得する方法として、java.net.URL#openStreamメソッドの利用があります。しかし、この方法には以下の問題があります。
- サーバへのリクエスト中にHTTPヘッダをセットすることができない
- GETメソッドによるデータ取得しかできず、POSTメソッドによるデータ送信ができない
こうしたことは、単純な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#setDoOutput(boolean doputput)メソッドの引数にtrueをセットして呼び出し、POSTによるデータ送信を可能にする
- java.net.URLConnection#getOutputStreamメソッドでjava.io.OutputStreamクラスのオブジェクトを取得し、取得したストリームにデータを出力することでデータを送信する
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.