싸피에서 2학기 계절방학 필수과제로 RestTemplate이라는 것을 사용해보고자 한다.
우선 스프링환경이 아닌 쌩 Java환경의 경우는 HttpURLConnection도 사용가능하다. 그냥 블로그에 있는 코드를 다 가져왔다.
static void useHTTPURLConnection(){
try {
// API 엔드포인트 URL, {API_KEY}에는 본인이 발급받은 API KEY 입력
String apiUrl = "https://api.odcloud.kr/api/15044439/v1/uddi:da23f623-09bb-44a6-85ee-f3633853e18a?page=1&perPage=10&serviceKey={API_KEY}";
// URL 객체 생성
URL url = new URL(apiUrl);
// HttpURLConnection 객체 생성
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 요청 메서드 설정 (GET 또는 POST 등)
connection.setRequestMethod("GET");
// 응답 코드 확인
int responseCode = connection.getResponseCode();
System.out.println("HTTPURLConnection Response Code: " + responseCode);
// 응답 데이터 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuffer response = new StringBuffer();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// 응답 데이터 출력
System.out.println("HTTPURLConnection Response Data: " + response.toString());
// 연결 종료
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
이와 같은 방식으로 RestTemplate을 사용하고자 했지만,
String apiUrl = "https://api.odcloud.kr/api/15044439/v1/uddi:da23f623-09bb-44a6-85ee-f3633853e18a?page=1&perPage=10&serviceKey={API_KEY}";
// RestTemplate 객체 생성
RestTemplate restTemplate = new RestTemplate();
// GET 요청 보내기
ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class);
이렇게 하니까 올바르지 않은 인증키라는 것이다. PostMan으로 확인했을 때는 그냥 저 apiUrl을 get으로 요청하면 잘 나오던데..
Spring Boot에서 오류가 나면 자동으로 오류메시지를 콘솔에 찍어주지 않는 듯 하다. 어떻게 해야하지 하다가
try catch문으로 오류를 확인할 수 있었다.
또한 PostMan에서 그냥 get방식으로 요청할 때 처음에 결과가 나오지 않고
{ "code": 0, "msg": "정상" }처럼 나오는 것이다.
공공데이터포털에 swagger가 있어서 테스트할 때는 잘 나오고.. 그래서 거기공공데이터포털swagger를 잘 살펴 봤더니
이런 부분이 있는 것이다.. 그러고 포스트맨을 봤더니
이렇게 되어 있어서Content-Length내용을 바꾸려고 해봤더니 바뀌지 않아서 그냥 왼쪽에 체크를 해제했더니 정상적으로 데이터가 아래처럼 출력되었다.. 왜지?
아무튼 그래서 다른 블로그를 찾아 아래처럼 하려고 했다. 근데도 또 등록되지 않은 인증키라는 것이다.. 아니 왜오애애ㅙ왜왜ㅙ애 안되냐고
URI uri = UriComponentsBuilder //주소를 만들떄 : UriComponentBuilder를 사용
.fromUriString(apiUrl)
// .path("")
.queryParam("page", "1")
.queryParam("perPage", "10")
.queryParam("serviceKey", {API_KEY})
.encode()
.build()
.toUri();
ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);
다음날 정신을 차리고 다시 시도해보았다. 공공데이터포털의 open api이용 가이드에는 다음과 같이 인증키를 사용하는 방식은 헤더에 넣는 방식과, 쿼리스트링으로 넣는 방식 2가지가 있다고 한다.

지금까지는 쉽게 쿼리스트링에 넣었으니, 이제는 헤더에 넣어보려고 한다. 구글링을 해보니 RestTemplate에서 get에 헤더를 사용하려면 exchange라는 메소드를 사용해야 한다고 한다. 해당 메소드를 사용하니 성공했다.. RestTemplate에 인증키를 넣으려면 그냥 쿼리스트링으로는 안들어가고 무조건 헤더를 써야하나..? 싶다.
static void useRestTemplate(){
String apiUrl = "https://api.odcloud.kr/api/15044439/v1/uddi:da23f623-09bb-44a6-85ee-f3633853e18a?page=1&perPage=10";
// RestTemplate 객체 생성
RestTemplate restTemplate = new RestTemplate();
// GET 요청 보내기
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Infuser b9ciNjKYWEKxKrhcMw2QzeyIcKmZB8QZ/JcRMLN/qu3xZUkDFDJYfzD/DgPWWwpe7vlL3uY4F686+7jFa6aYbg==");
HttpEntity request = new HttpEntity(headers);
ResponseEntity<String> response = restTemplate.exchange(
apiUrl,
HttpMethod.GET,
request,
String.class
);
// 응답 코드 확인
int statusCode = response.getStatusCodeValue();
System.out.println("RestTemplate Response Code: " + statusCode);
// 응답 데이터 확인
String responseData = response.getBody();
System.out.println("RestTemplate Response Data: " + responseData);
}