반응형

이번 글에서는 RestAPI를 구현하기 위해 사용하는 HttpsURLConnection에 대해 글을 작성합니다.


HttpsURLConnection이란?

HttpsURLConnection은 HttpURLConnection을 상속받고 있고, SSL이 적용되어 있는 사이트에 접근을 하거나 REST API를 사용하여 호출을 하는 등의 방법을 사용하기 위해 사용하기 위한 클래스다. HttpURLConnection(서브 클래스)은 URLConnection(수퍼 클래스)의 서브 클래스로 되어 있으며 HttpsURLConnection이 HttpURLConnection을 상속받는다.

 

URLConnection

URLConnection은 SSL이 미적용 되어 있거나 보안 인증이 되어 있지 않은 웹서버에 접속하여 이미지, 파일, 크롤링 등을 하는데 사용한다. URLConnection은 수퍼 클래스로, 서브 클래스인 HttpURLConnection과 JarURLConnection을 가진다. 거기에 이 클래스들은 추상 클래스이기 때문에 인스턴스를 재사용할 수가 없으며, 커넥션을 추가할 경우에는 새로 다른 인스턴스를 만들어서 사용해야 한다.

java.lang.Object
java.net.URLConnection

public abstract class URLConnection extends Object

 

URLConnection을 사용할 때 아래와 같은 순서로 진행이 된다.

물론, 1번과 2번에 대해서는 필수지만, 3번부터 6번까지는 생략도 가능하고 로직을 바꿔도 된다.

 

1. URL 객체 생성(Create Connection)

2. URLConnection(HttpURLConnection, HttpsURLConnection) 객체 생성(openConnection)

3. URLConnection(HttpURLConnection, HttpsURLConnection) 옵션 설정

4. 입출력 스트림 데이터 핸들링

5. 연결 종료

6. 결과 가져오기

7. 접속 해지

 

1. URL 객체 생성(Create Connection)

REST API를 사용하기 위해 가장 첫 번째는 URL에 대한 객체를 생성해야 한다.

그래서, targetURL에 원하는 URL을 설정하여 url 객체를 생성하면 된다.

//1. Create connection
URL url = new URL(targetURL);

 

2. URLConnection(HttpURLConnection, HttpsURLConnection) 객체 생성(openConnection)

HttpURLConnection 또는 HttpsURLConnection의 인스턴스는 url.openConnection() 메소드를 호출하여 새로 만든다. 

// URLConnection
URLConnection connection = url.openConnection();

// HttpURLConnection 캐스팅 필요
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

// HttpsURLConnection 캐스팅 필요
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

 

3. URLConnection(HttpURLConnection, HttpsURLConnection) 옵션 설정

1) setConnectTimeout(int timeout)

- 연결 타임아웃 시간 설정(서버 접속 기준)

- timeout : default는 0이다. 밀리초 기준이므로 * 1000을 하여 단위 기준을 줄일 수 있다.

connection.setConnectTimeout(3600 * 1000); // 1시간

 

2) setReadTimeout(int timeout)

- Read 타임아웃 시간 설정(Read시 연결 기준)

- timeout : default는 0이다. 밀리초 기준이므로 * 1000을 하여 단위 기준을 줄일 수 있다.

connection.setReadTimeout(3600 * 1000); // 1시간

 

3) setRequestMethod(String method)

- 요청 방식은 GET, POST, DELETE, PUT, TRACE, HEAD, OPTION

- DEFAULT : GET

connection.setRequestMethod("POST");

- 위의 요청 방식에서 GET, POST를 제외한 나머지 방식이 안되는 경우 아래 URL 참고

https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch/46323891#46323891

 

HttpURLConnection Invalid HTTP method: PATCH

When I try to use a non-standard HTTP Method like PATCH with URLConnection: HttpURLConnection conn = (HttpURLConnection) new URL("http://example.com").openConnection(); conn.setRequestMeth...

stackoverflow.com

 

4) connection.setRequestProperty("Content-Type", "application/json")

- Content-Type을 application/json 형식으로 전달

connection.setRequestProperty("Content-Type", "application/json");

 

5) connection.setRequestProperty("Content-Type", "application/xml")

- Content-Type을 application/xml 형식으로 전달

connection.setRequestProperty("Content-Type", "application/xml");

 

6) connection.setRequestProperty("Accept-Charset", "UTF-8")

- Accept-Charset을 UTF-8로 설정

connection.setRequestProperty("Accept-Charset", "UTF-8");

 

7) connection.setRequestProperty("Content-Length", Integer.toString(textByte.length))

- Content-Length를 넣은 파라미터만큼 길이를 정한다.

byte[] textByte = urlParameters.getBytes("UTF-8");
connection.setRequestProperty("Content-Length", Integer.toString(textByte.length));

 

8) connection.setRequestProperty(String key, String value);

- key : value 형태로 setRequestProperty 설정

 

9) connection.setUseCaches(false);

- DEFAULT : true

- 캐시 사용 여부 설정

connection.setUseCaches(false);

 

10) connection.setDoInput(true);

- connection에 입력 스트림 허용 여부 설정

- DEFAULT : true

connection.setDoInput(true);

 

11) connection.setDoOutput(true);

- connection에 출력 스트림 허용 여부 설정

- DEFAULT : true

connection.setDoOutput(true);

 

4. 입출력 스트림 데이터 핸들링

데이터를 보내기 위해 getOutputStream() 사용하여 OutputStream 객체 생성

OutputStream out = connection.getOutputStream();

 

데이터를 작성한다.

out.write(textByte, 0, textByte.length);
out.flush();

 

5. 연결 종료

out.close();

 

6. 결과 가져오기

InputStream 객체를 생성해서 connection 객체에서 inputStream을 가져오고, 문제가 발생하면 에러를 출력하고 마지막엔 connection에 대해 접속을 해지한다.

InputStream is = connection.getInputStream();

StringBuffer sb = new StringBuffer();
String line = null;
try {
	BufferedReader reader = new BufferedReader(new InputStreamReader(is));
	while ((line = reader.readLine()) != null) {
		sb.append(line);
	}
} catch (Exception e) {
	log.error("Error reading JSON string", e);
} finally {
	if (connection != null) {
		connection.disconnect();
	}
}

is.close();

 

아래와 같이 응답 코드를 코드로 받는다.

int result = connection.getResponseCode();

- 200 : 성공

- 나머지 : 에러

https://developer.mozilla.org/ko/docs/Web/HTTP/Status

 

HTTP 상태 코드 - HTTP | MDN

HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고

developer.mozilla.org

 

7. 접속 해지

if (connection != null) {
	connection.disconnect();
}

참고 URL

https://mytalkhome.tistory.com/entry/HttpURLConnection-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%B0%B8%EA%B3%A0%EC%82%AC%ED%95%AD

https://blueyikim.tistory.com/2199

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기