Rest API 통신 방법 - HttpURLConnection, RestTemplate
HttpURLConnection 으로 통신하기
-
- 원시 HTTP 연결 사용:
- HttpURLConnection 클래스를 사용하여 HTTP 요청을 직접 생성하고 관리합니다.
- URL을 사용하여 연결을 열고, 요청 메서드, 헤더, 타임아웃 등을 설정합니다.
- 요청 본문을 쓰기 위해 BufferedWriter를 사용하고, 응답을 읽기 위해 BufferedReader를 사용합니다.
- 예외 처리:
- SocketTimeoutException, IOException 등을 개별적으로 처리합니다.
- 연결이 끝난 후 finally 블록에서 연결을 닫습니다.
- 직접 JSON 생성:
- JSONObject와 JSONArray를 사용하여 JSON 요청 본문을 직접 생성합니다.
- 응답 처리:
- 응답 코드를 출력하고, 응답 본문을 StringBuilder를 사용하여 읽습니다.
- 원시 HTTP 연결 사용:
- 예시)
HttpURLConnection conn = null;
StringBuilder response = new StringBuilder();
String recvJsonData = "";
try {
URL url = new URL(HOST_URL);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.setConnectTimeout(TIMEOUT);
conn.setReadTimeout(TIMEOUT);
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"))) {
bw.write(jsonParam);
bw.flush();
}
int responseCode = conn.getResponseCode();
System.out.println("Response Code: " + responseCode);
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"))) {
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
}
recvJsonData = response.toString();
System.out.println("Response JSON: " + recvJsonData);
} catch (SocketTimeoutException ste) {
System.err.println("Timeout occurred: " + ste.getMessage());
} catch (IOException ioex) {
ioex.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
}
}
Spring RestTemplate 으로 통신하기
- Spring RestTemplate 사용:
- RestTemplate 클래스를 사용하여 HTTP 요청을 보냅니다.
- RestTemplate은 HTTP 요청 및 응답 처리를 더 간단하게 만들어 줍니다.
- 헤더 및 요청 본문 설정:
- HttpHeaders 클래스를 사용하여 HTTP 헤더를 설정합니다.
- JSONObject와 JSONArray를 사용하여 JSON 요청 본문을 생성합니다.
- HttpEntity를 사용하여 요청 본문과 헤더를 함께 묶습니다.
- 예외 처리:
- 주석 처리된 부분에서는 HttpClientErrorException, HttpServerErrorException, RestClientException 등을 처리합니다.
- 예외 처리 부분이 더 구조적이고 구체적입니다.
- 응답 처리:
- restTemplate.postForObject 메서드를 사용하여 POST 요청을 보내고, 응답을 String으로 받습니다.
- 응답을 출력하고 반환합니다.
private static final String URL = ""
private static final String API_KEY = "";
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "application/json");
headers.set("Ocp-Apim-Subscription-Key", API_KEY);
// JSON 객체 생성
JSONObject jsonObject = createJsonRequest();
// HTTP 헤더 설정
HttpHeaders headers = createHttpHeaders();
HttpEntity<String> requestEntity = new HttpEntity<>(jsonObject.toString(), headers);
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.postForObject(URL, requestEntity, String.class);
System.out.println("Response: " + response);