Development note/Java

[Java] HttpUrlConnection을 이용해서 웹 페이지를 가져오기

v명월v 2019. 6. 21. 09:00

안녕하세요. 명월입니다.


이 글은 Java에서 HttpConnection을 이용해서 웹 페이지를 가져오는 방법에 대한 글입니다.


이전에 C#으로 HttpConnection을 이용하는 방법에 대해 소개한 적이 있습니다.

링크 - [C#] HttpConnection을 이용해서 웹 페이지 가져오기


대체로 Java와 C#은 비슷하기 때문에 사용하는 객체의 이름만 다를 뿐 방법은 비슷하다고 생각합니다.

Java의 HttpConnection도 C#과 마찬가지로 웹의 렌더링이 이루어지지 않고 순수한 웹 페이지만 읽어 옵니다. 그래서 xml 파일이나 html의 메타태그를 이용하거나 웹페이지 간의 API를 참조하는 방법으로는 유용하게 사용될 듯싶습니다.

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;

public class HttpConnectionExample {
  // Request 메소드 정의
  public enum HttpMethod {
    GET, POST
  }

  // HttpURLConnection를 실행하는 함수
  public static String getRequest(String url, HttpMethod method, Map<String, Object> parameter) {
    try {
      String param = null;
      // 파라미터가 있을 경우, 파라미터키=파라미터값&파라미터키=파라미터값&파라미터키=파라미터값 의 형태로 만든다.
      if (parameter != null) {
        StringBuffer sb = new StringBuffer();
        for (String key : parameter.keySet()) {
          if (sb.length() > 0) {
            sb.append("&");
          }
          sb.append(key);
          sb.append("=");
          sb.append(parameter.get(key));
        }
        param = sb.toString();
      } else {
        param = "";
      }
      // Http method가 GET 방식의 경우 파라미터를 url 주소 뒤에 붙인다.
      if (HttpMethod.GET.equals(method)) {
        if (url.contains("?")) {
          url += "&" + param;
        } else {
          url += "?" + param;
        }
      }
      URL uri = new URL(url);
      // url를 통해 HttpURLConnection 클래스를 생성한다.
      HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
      // 해더의 메소드를 정의한다.
      connection.setRequestMethod(method.toString());
      // 해더의 ContentType를 정의한다.
      connection.setRequestProperty("ContentType", "application/x-www-form-urlencoded");
      
      // Http method가 POST 방식의 경우, 해더 아래에
      if (HttpMethod.POST.equals(method)) {
        // 커넥션의 header 밑의 stream을 사용한다. (Get의 경우는 필요가 없다.)
        connection.setDoOutput(true);
        try (DataOutputStream output = new DataOutputStream(connection.getOutputStream())) {
          output.writeBytes(param);
          output.flush();
        }
      }
      // 프로토콜의 반환 코드를 받을 수 있다. (200이면 정상이다.)
      int code = connection.getResponseCode();
      System.out.println(code);

      // 스트림으로 반환 결과값을 받는다.
      try (BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
        String line;
        StringBuffer buffer = new StringBuffer();
        while ((line = input.readLine()) != null) {
          buffer.append(line);
        }
        return buffer.toString();
      }
    } catch (Throwable e) {
      throw new RuntimeException(e);
    }
  }

  public static void main(String[] args) {
    Map<String, Object> parameter = new HashMap<>();
    parameter.put("param", "test");
    // localhost에 Get 방식으로 접속해서 파라미터는 param=test이다.
    // http://localhost/index.php?param=test
    String html = getRequest("http://localhost/index.php", HttpMethod.GET, parameter);
    System.out.println(html);
    
    // localhost에 Post 방식으로 접속해서 파라미터는 param=test이다.
    html = getRequest("http://localhost/index.php", HttpMethod.POST, parameter);
    System.out.println(html);
  }
}

제가 위 소스를 위해서 apache로 php 예제를 만들었습니다.

<?php
  error_reporting(E_ALL & ~E_NOTICE);
  // Post 방식의 경우 Post에서 값을 가져온다.
  echo "POST - ".$_POST["param"];
  echo "<br />";
  // Get 방식의 경우 파라미터에서 주소를 가져온다.
  echo "GET - ".$_GET["param"];
?>

위 php를 http://localhost/index.php로 지정한 다음, 위 작성한 소스를 실행하겠습니다.

위와 같은 결과를 얻었습니다.


200은 웹 페이지의 응답코드입니다. 200이면 정상입니다.

예제로 Get방식과 Post 방식으로 두 번 실행했습니다.


첫번째는 Get 방식으로 접속을 해서 결과 데이터의 Get=Test의 결과를 얻었습니다.

두번째는 Post 방식으로 접속을 해서 Post=Test의 결과를 얻었습니다.


여기까지 HttpURLConnection 를 이용해서 웹 페이지를 읽어 드리는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.