[스프링부트] Open API
스프링부트에 관광 정보를 활용하기 위해 API를 사용하기로 했다. 크롤링과 API는 비슷해보이지만 효율상 API가 더 우위에 있다.
1. 활용하고자하는 API를 정한다.
https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15057787
한국관광공사_국문 관광정보 서비스
코드조회 및 관광정보의 통합/상세 검색 및 위치기반,지역기반 등 국내 관광에 대한 전반적인 정보를 국문으로 제공한다.
www.data.go.kr
[활용신청]을 통해 키를 발급받을 수 있다. 보통 1시간 내외로 발급된다했지만 나는 하루가 지나서야 키가 정식으로 발급되었다. 키가 발급되었다면 Encoding 키를 복사해 테스트가 가능하다.
2. 키 발급이 정상적으로 이루어졌는지 확인한다.
요청변수(주소창 파라미터)에 넣을 수 있는 변수들로 필수와 옵션으로 나누어진다. 또한 아래에 샘플 코드도 제공한다. (코드 찾으려고 몇시간동안 고생했는데 완성하고나서 알게되었다...)
3.1. JAVA 코드 - String
@GetMapping("/api")
public String allowBasic() {
StringBuffer result = new StringBuffer();
try {
StringBuilder urlBuilder = new StringBuilder("http://api.visitkorea.or.kr/openapi/service/rest/KorService/areaCode");
urlBuilder.append("?" + URLEncoder.encode("ServiceKey", "UTF-8") + "=발급받은 키");
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("10", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("MobileOS", "UTF-8") + "=" + URLEncoder.encode("ETC", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("MobileApp", "UTF-8") + "=" + URLEncoder.encode("AppTest", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("areaCode", "UTF-8") + "=" + URLEncoder.encode("6", "UTF-8"));
urlBuilder.append("&_type=json");//문서참조
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader rd;
// rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
String line;
while ((line = rd.readLine()) != null) {
result.append(line + "\n");
}
rd.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return result + "";
}
샘플코드와 거의 동일하며 try catch문만 추가했다. json 타입으로 변환하기 위해선 별도의 파라미터가 필요한데 type, datatype, _type 등등 API마다 다르기 때문에 활용메뉴얼을 꼭 확인하자. 예제로 활용된 API의 경우 _type=json 을 URL에 추가해 json으로 받을 수 있었다.
3.2. JAVA 코드 - JSON
@GetMapping("/api2")
public List<Map<String, Object>> allowBasic2() {
RestTemplate rt = new RestTemplate();
RequestEntity requestEntity = null;
try {
requestEntity = RequestEntity
.get(new URI("http://api.visitkorea.or.kr/openapi/service/rest/KorService/areaCode"
+ "?serviceKey=발급받은키"
+ "&numOfRows=10"
+ "&pageNo=1"
+ "&MobileOS=ETC"
+ "&MobileApp=AppTest"
+ "&areaCode=6"
+ "&_type=json")).build();
} catch (URISyntaxException e) {
e.printStackTrace();
}
ResponseEntity<Map> entity = rt.exchange(requestEntity, Map.class);
Map<String, Object> result = entity.getBody();
Map<String, Object> response = (Map<String, Object>) result.get("response");
Map<String, Object> body = (Map<String, Object>) response.get("body");
Map<String, Object> items = (Map<String, Object>) body.get("items");
List<Map<String, Object>> item = (List<Map<String, Object>>) items.get("item");
return item;
}
오른쪽은 크롬 확장 프로그램인 JSON 뷰어를 활용해서 보이는 화면이다. 확장프로그램을 끄면 3.1.과 같은 결과가 나온다.
그러나 3.1.은 결국 String 리턴타입이기 때문에 확장프로그램이 인식하지 못한다.