powerdee.com
Google
 
このサイト内 Web
 
カウンタ

その1 JavaでHTTP通信

HTTP通信をjava.net.Socketで行う。

HTTP通信なら、jdkのHttpURLConnectionやJakarta Commons HttpClient などで簡単にできそうですが、ここではjava.net.Socketで通信を行います。

やりたいこと

  • プロキシ経由で外部に通信する
  • URLを指定する
  • コネクションタイムアウトを指定する
  • POSTメソッドでデータを送信する
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Map;

import org.apache.log4j.Logger;

/**
 * HTTPのPOSTメソッドを使用してリクエストメッセージを発行する。
 */
public class HTTPUtil {

    /** ログクラス */
    private static Logger log = Logger.getLogger(HTTPUtil.class);
    
    /**
     * HTTPでリクエストメッセージを発行し、レスポンスを返す。
     * 
     * @param proxyHost プロキシサーバホスト
     * @param proxyPort プロキシサーバポート
     * @param String targetUrl 接続先URL
     * @param int timeout 接続タイムアウト(ミリ秒で指定)
     * @param Map postData POSTメソッドで送信するデータ
     * @return String レスポンスデータ
     */
    public static String getHttpResponse(String proxyHost, 
                                         int proxyPort, 
                                         String targetUrl, 
                                         int timeout, 
                                         Map postData) {
            
        // POSTで送信するデータを設定
        Iterator itr = postData.keySet().iterator();
        StringBuffer data = new StringBuffer();
        while (itr.hasNext()) {
            String mapKey = (String)itr.next();
            data.append(mapKey + "=" + postData.get(mapKey) + "&");
        }
        
        Socket sock;
        BufferedReader sockin;
        BufferedWriter sockout;
        StringBuffer responseBody = new StringBuffer();

        try {
            // ソケットの作成
            sock = new Socket(proxyHost, proxyPort);
            // タイムアウト値を設定
            sock.setSoTimeout(timeout);
            sockin = new BufferedReader
                (new InputStreamReader(sock.getInputStream()));
            sockout = new BufferedWriter
                (new OutputStreamWriter(sock.getOutputStream()));

            // HTTPリクエスト送信
            sockout.write("POST " + targetUrl + " HTTP/1.1\n");
            sockout.write("Host: " + proxyHost + "\n");
            sockout.write("Content-type: application/x-www-form-urlencoded\n");
            sockout.write("Content-length: " 
                + data.toString().getBytes().length+ "\n\n");
            sockout.write(data + "\n");
            sockout.flush();

            // HTTPレスポンス受信 (ヘッダーは除外する)
            String inputLine;
            boolean header_flg = false;
            while ((inputLine = sockin.readLine()) != null) {
                if (inputLine.equals("")) {
                    header_flg = true;
                }
                if (header_flg) {
                    responseBody.append(inputLine);
                }
            }
            // ソケットのクローズ
            sockout.close();
            sockin.close();
            sock.close();
        } catch (UnknownHostException e) {
            log.error("プロキシサーバの名前解決ができません。", e);
            throw new Exception();
        } catch (IOException e) {
            log.error("HTTP通信処理で障害が発生しました。", e);
            throw new Exception();
        }
        return responseBody.toString();
    }
}

業務では、まだjdk1.3.1以前を使っているところも多いかと思います。Socketのような低レベルな処理なら問題も発生しにくいと思います。


ページTopへ / ▲Homeへ