참고: https://fbtmdwhd33.tistory.com/264 - 데이터 받아오기
https://fbtmdwhd33.tistory.com/264
https://velog.io/@garam0410/Java-OPEN-API-%ED%8C%8C%EC%8B%B1%ED%95%98%EA%B8%B0-JSON - 데이터 파싱
일단 회원가입부터 해서 로그인을 하고 오픈 API 중에 고르면 된다
전체적인 코드 프로세스는 다음과 같다
일단 코드부터
public class ApiParsing {
public static void main(String[] args) throws IOException{
// 1. URL을 만들기 위한 StringBuilder.
StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/1360000/TourStnInfoService/getTourStnVilageFcst"); /*URL*/
// 2. 오픈 API의 요청 규격에 맞는 파라미터 생성. serviceKey 부분에 반드시 내가 인증받은 인코딩 키를 넣어주어야 한다!!
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=IcEEJqA4ODLN%2Fj5IFtBpQWKcVpNGc%2FG3m0d4xcwjqi3NR6WgkNJ6fV6fTzxrWKR1Op0Bq3ghZjiD3R7goSvaAQ%3D%3D"); /*Service Key*/
urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/
urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode("JSON", "UTF-8")); /*요청자료형식(XML/JSON)*/
urlBuilder.append("&" + URLEncoder.encode("CURRENT_DATE","UTF-8") + "=" + URLEncoder.encode("2019122010", "UTF-8")); /*2016-12-01 01시부터 조회*/
urlBuilder.append("&" + URLEncoder.encode("HOUR","UTF-8") + "=" + URLEncoder.encode("24", "UTF-8")); /*CURRENT_DATE부터 24시간 후까지의 자료 호출*/
urlBuilder.append("&" + URLEncoder.encode("COURSE_ID","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*관광 코스ID*/
// 3. URL 객체 생성 (toString으로 string으로 변환)
URL url = new URL(urlBuilder.toString());
// 4. 요청하고자 하는 URL과 통신하기 위한 Connection 객체 생성.
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// 5. 통신을 위한 메소드 SET (Get 요청)
conn.setRequestMethod("GET");
// 6. 통신을 위한 Content-type SET. (json으로 설정해야됨)
conn.setRequestProperty("Content-tupe", "application/json");
// 7. 통신 응답 코드 확인.
System.out.println("Response Code " + conn.getResponseCode());
// 8. 전달받은 데이터를 BufferedReader 객체로 저장. 오류가 날 경우 error 발생
BufferedReader rd;
if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300){
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader((conn.getErrorStream())));
}
// 9. 저장된 데이터를 라인별로 읽어 StringBuilder 객체로 저장.
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
// 문자열로 바꾸기
String result = sb.toString();
System.out.println("전체 response = " + result);
// 10. 객체 해제
rd.close();
conn.disconnect();
try{
// 1. 문자열 형태의 JSON을 파싱하기 위한 JSONParser 객체 생성.
JSONParser parser = new JSONParser();
// 2. 문자열을 JSON 형태로 JSONObject 객체에 저장.
JSONObject obj = (JSONObject)parser.parse(result);
JSONObject responseResult = (JSONObject)obj.get("response");
JSONObject bodyResult = (JSONObject)responseResult.get("body");
JSONObject itemsResult = (JSONObject)bodyResult.get("items");
JSONArray itemResult = (JSONArray) itemsResult.get("item");
// JSONObject itemResult = (JSONObject)itemsResult.get("item");
for (Object item : itemResult) {
System.out.println(item);
}
} catch (ParseException e) { System.out.println(e.getMessage()); }
}
}
홈페이지에 오픈 api별로 요청 변수가 지정되어 있다. 아래 사진이 공공데이터포털 홈페이지에서 캡쳐한 요청 변수 사진이다. 2번 코드가 이 사진대로 요청 변수를 명시해준 것이다.
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=IcEEJqA4ODLN%2Fj5IFtBpQWKcVpNGc%2FG3m0d4xcwjqi3NR6WgkNJ6fV6fTzxrWKR1Op0Bq3ghZjiD3R7goSvaAQ%3D%3D");
2번에서 serviceKey를 설정하는 부분이다. + 뒤에 "=여기에 인증 키를 넣어주면 된다" =를 삭제해도 안됨