티스토리 뷰

Programming/Spring

[스프링부트] Open API

감성적인 개발자 2021. 7. 19. 01:01

스프링부트에 관광 정보를 활용하기 위해 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 리턴타입이기 때문에 확장프로그램이 인식하지 못한다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함