接続先のURLへ情報を送信し、結果を保存するJavaTips 〜Javaプログラミング編

» 2004年07月27日 10時00分 公開
[BULL@IT]

 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後にサーバから送られるデータを取得するサンプルプログラムを以下に示します。

WWWGet.java
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された内容を表示するものであるとします。

post.jsp
<%@ 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。