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 를 이용해서 웹 페이지를 읽어 드리는 방법에 대한 설명이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.