JavaでHTTPリクエストを送信する方法 - URLConnectionの利用

Javaの標準ライブラリを用いてHTTP通信を実装する手順を解説します。

通信手順

  1. URLオブジェクトからURLConnectionを取得
  2. リクエストパラメータの設定
  3. リクエストの送出
  4. 応答内容の取得(InputStream経由)
  5. リソースの解放

クライアント側処理

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpClient {
    public static void main(String[] args) {
        try {
            System.out.println(sendGetRequest("http://localhost:8080/HttpServer"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String sendGetRequest(String endpoint) throws Exception {
        URL targetUrl = new URL(endpoint);
        HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();
        
        connection.setRequestProperty("Accept-Charset", "UTF-8");
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        
        if (connection.getResponseCode() >= 300) {
            throw new Exception("リクエスト失敗: HTTP " + connection.getResponseCode());
        }

        StringBuilder response = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(connection.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        }
        return response.toString();
    }
}

GETリクエストコード

import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpClient {
    public static void main(String[] args) {
        try {
            System.out.println(sendPostRequest("http://localhost:8080/HttpServer", 
                "user=sample&token=abc123"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String sendPostRequest(String endpoint, String parameters) throws Exception {
        URL targetUrl = new URL(endpoint);
        HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();
        
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        connection.setRequestProperty("Content-Length", String.valueOf(parameters.length()));
        
        if (connection.getResponseCode() >= 300) {
            throw new Exception("リクエスト失敗: HTTP " + connection.getResponseCode());
        }

        StringBuilder response = new StringBuilder();
        try (OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream())) {
            writer.write(parameters);
            writer.flush();

            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
            }
        }
        return response.toString();
    }
}

POSTリクエストコード

サーバー側処理

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DataReceiverServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws IOException {
        String userInput = request.getParameter("user");
        String authKey = request.getParameter("token");
        
        System.out.println("ユーザー: " + userInput);
        System.out.println("トークン: " + authKey);
        
        response.setContentType("text/plain;charset=UTF-8");
        response.getWriter().write("受信完了");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws IOException {
        doPost(request, response);
    }
}

Servletコード

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
  
  <servlet>
    <servlet-name>DataReceiver</servlet-name>
    <servlet-class>DataReceiverServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>DataReceiver</servlet-name>
    <url-pattern>/receive</url-pattern>
  </servlet-mapping>
  
</web-app>

web.xml設定

実例:地図API利用

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class MapServiceClient {
    public static void main(String[] args) {
        try {
            System.out.println(sendRequest("http://api.map.baidu.com/geoconv/v1/?", 
                "coords=114.21892734521,29.575429778924&ak=ZQU8ZGeBf95nN8wY1cNL13NP&output=json"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String sendRequest(String baseUrl, String parameters) throws Exception {
        URL targetUrl = new URL(baseUrl + parameters);
        URLConnection connection = targetUrl.openConnection();
        
        connection.setRequestProperty("User-Agent", "Mozilla/5.0");
        connection.setRequestProperty("Accept", "*/*");
        
        StringBuilder response = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        }
        return response.toString();
    }
}

API利用コード

タグ: Java HttpURLConnection Servlet HTTP通信 リクエスト処理

8月10日 20:05 投稿