공공데이터 포털 오픈 API 받아오기 & 파싱

SH·2022년 8월 9일
0

한이음 ICT

목록 보기
8/8

참고: 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 중에 고르면 된다

전체적인 코드 프로세스는 다음과 같다

  1. 오픈 api 상세정보에 나와있는 요청 변수(request parameter)에 맞춰서 url 객체를 만든다
  2. url과 통신하기 위한 connection 객체를 만들고 메소드, Content-type 등을 설정해준다
  3. 응답을 받아오기 위해 메소드 종류, Content-type 등을 설정해줌
  4. 응답받은 데이터를 한 줄씩 읽어옴

일단 코드부터


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를 설정하는 부분이다. + 뒤에 "=여기에 인증 키를 넣어주면 된다" =를 삭제해도 안됨

profile
블로그 정리안하는 J개발자

0개의 댓글