📎출처
이번 랩실 프로젝트를 진행하면서 java http통신을 이용할 일이 생겨 찾아보았다.
위의 출처에 올라온 글에 java를 이용한 http 통신에 사용되는 클래스와 메소드들에 대해 자세히 설명되어 있어 해당 글을 이용해 공부하고 요약하였다.
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
private static final String URL = "https://www.google.com";
private static final String POST = "POST";
private static final String USER_AGENT = "Mozilla/5.0";
private static final String DATA = "test data";
public static void main(String[] args) throws IOException {
URL url = new URL(URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(POST);
connection.setRequestProperty("User-Agent", USER_AGENT);
connection.setDoOutput(true);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(DATA);
outputStream.flush();
outputStream.close();
int responseCode = connection.getResponseCode();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer stringBuffer = new StringBuffer();
String inputLine;
while ((inputLine = bufferedReader.readLine()) != null) {
stringBuffer.append(inputLine);
}
bufferedReader.close();
String response = stringBuffer.toString();
}
}
Java로 Http 통신을 하기 위해선 Java API를 활용해야한다.
java.net 패키지에는 네트워크 애플리케이션을 구현하기 위한 클래스들이 있는데 이 패키지에 있는 HttpUrlConnection
클래스와 URL
클래스를 활용해 HTTP 통신을 할 수 있다.
URL 클래스의 생성자는 다양한 형태로 선언되어 있는데, url을 문자열 형태로 나타낸 객체의 레퍼런스를 인자로 전달받는 생성자를 이용할 것이다.
https://www.google.com 의 url을 나타내는 URL 객체를 생성하고 싶다면 다음과 같이 작성하면 된다. 이때, 예외처리를 해주어야 한다.
import java.net.URL;
URL url = new URL("https://www.google.com");
URL 클래스에 선언된 openConnection()
메소드는 url 객체에 대한 연결을 담당하는 URLConnection 객체를 반환한다.
위에서 생성한 URL 객체에 대한 연결 객체를 얻기 위해선 다음과 같이 작성하면 된다.
URLConnection connection = url.openConnection();
HttpURLConnection 클래스는 HTTP 프로토콜 통신을 위한 클래스이다. 각각의 객체들은 하나의 요청을 위해 사용된다.
https://www.google.com 의 url에 연결하는 http 연결 객체를 생성하고 싶다면 다음과 같이 작성하면 된다.
import java.net.URL;
import java.net.HttpURLConnection;
URL url = new URL("https://www.google.com");
HttpURLConnection connection = (HttpURLConnection) url. openConnection();
HTTP 요청을 위해서는 요청 메소드를 설정해야한다. setRequestMethod()
메소드는 요청 메소드를 문자열 파라미터로 받아서 유효한 요청 메소드면 method 멤버 변수에 저장하고 아니면 ProtocolException 예외를 발생시킨다.
처리할 수 있는 요청 메소드로는 GET,POST,HEAD,OPTIONS, PUT,DELETE,TRACE 가 있다.
위에서 생성한 HTTPURLConnection 객체로 GET 요청을 하고 싶다면 다음과 같이 코드를 작성하면 된다.
connection.setRequestMethod("GET");
setRequestProperty()
메소드로 요청 헤더를 설정할 수 있다.
요청 헤더를 설정함으로써 http 요청을 하는 사용자의 애플리케이션 타입, 운영체제, 소프트웨어 버전 등을 식별할 수 있다.
private static final String USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0";
...
connection.setRequestProperty("User-Agent", USER_AGENT);
POST 요청을 할 때에는 OutputStream 객체로 데이터를 전송한다. setDoOutput()
메소드를 통해 OutputStream 객체로 전송할 데이터가 있다는 옵션을 설정해야 한다.변수가 true이면 OutputStream 으로 데이터를 전송하고, false이면 하지 않는다는 뜻이다. false로 초기화 되어 있어 설정이 필요하다.
connection.setDoOutput(true);
전송할 데이터가 문자열일 경우는 OutputStream 클래스를 확장하는 DataOutputStream 클래스의 writebytes()
메소드를 활용하여 쉽게 데이터를 설정할 수 있습니다. DataOutputStream 클래스는 생성자에 OutptStream 객체를 전달하여 생성할 수 있습니다.
따라서 위에서 getOutputSteam()
메소드를 통해 얻은 객체를 바로 넣어줄 수 있습니다.
위에서 얻은 연결 객체에 전송할 데이터를 설정하기 위해 flush()
, close()
해줍니다.
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(DATA);
outputStream.flush();
outputStream.close();
getResponseCode()
메소드를 통해 응답 코드를 얻을 수 있습니다. 정상적인 응답일 경우 200이 반환됩니다.
int responseCode = connection.getResponseCode();
getInputStream()
메소드를 통해 응답 데이터를 읽을 수 있는 InputStream객체를 얻을 수 있습니다. 응답을 문자열 타입으로 얻기 위해 BufferedReader 객체를 사용할 수 있습니다.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer stringBuffer = new StringBuffer();
String inputLine;
while ((inputLine = bufferedReader.readLine()) != null) {
stringBuffer.append(inputLine);
}
bufferedReader.close();
String response = stringBuffer.toString();
GET 요청을 할 경우에는 요청 메소드를 GET으로 변경하고 OutputStream을 사용하지 않게끔 코드를 작성하면 된다.
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
private static final String URL = "https://www.google.com";
private static final String GET = "GET";
private static final String USER_AGENT = "Mozilla/5.0";
private static final String DATA = "test data";
public static void main(String[] args) throws IOException {
URL url = new URL(URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(GET);
connection.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = connection.getResponseCode();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer stringBuffer = new StringBuffer();
String inputLine;
while ((inputLine = bufferedReader.readLine()) != null) {
stringBuffer.append(inputLine);
}
bufferedReader.close();
String response = stringBuffer.toString();
}
}