이번 글에서는 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 참고
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
7. 접속 해지
if (connection != null) {
connection.disconnect();
}
참고 URL
'Language > Java' 카테고리의 다른 글
[Java] Java HashMap Key 가져오는 방법(Iterator 사용) (0) | 2023.05.22 |
---|---|
[Java] Java 현재 날짜, 시간 구하는 방법(Java 8버전 미만) (0) | 2023.05.22 |
[Java] Java에서 SAP JCO RFC 인터페이스 통신하는 방법 (0) | 2023.05.16 |
[Java] 자바 Int형 변수 String으로 변환하는 방법 (0) | 2023.03.03 |
[Java] 자바(Java) request.getRemoteAddr() 0:0:0:0:0:0:0:1 나오는 문제 해결 하는 방법 (0) | 2022.12.14 |
[Java] 자바(Java) String 변수 char 배열(String to Char), char 배열 String 변수(Char to String)로 변환하는 방법 (0) | 2022.11.14 |
[Java] 자바(Java) int 배열 String으로 변환하는 방법 (0) | 2022.10.28 |
[Java] 자바(Java) 기준 정규식 작성법 정리 (0) | 2022.10.12 |
최근댓글