ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 공공데이터 API 요청 보내고 응답 받기
    Java/Android Studio 2021. 7. 17. 21:59

    의료기기, 병원 등의 정보를 불러와서 휴대폰으로 볼 수 있도록 한다.

     

    안드로이드 스튜디오에서 공공데이터를 API로 불러오도록 해보자.

     

     

     

    data.go.kr (공공데이터 포털)에서 우선 활용신청을 한다.

     

    보통 인증키 받고 1~2시간 이후에나 사용 가능하다고 하는데 나는 대부분 10분안에 정상 응답이 왔던거 같다.

     

    /* Java 샘플 코드 */


    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.io.BufferedReader;
    import java.io.IOException;

    public class ApiExplorer {
        public static void main(String[] args) throws IOException {
            StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/B551182/hospInfoService1/getHospBasisList1"); /*URL*/
            urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=서비스키"); /*Service Key*/
            urlBuilder.append("&" + URLEncoder.encode("ServiceKey","UTF-8") + "=" + URLEncoder.encode("-", "UTF-8")); /*서비스키*/
            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("sidoCd","UTF-8") + "=" + URLEncoder.encode("110000", "UTF-8")); /*시도코드*/
            urlBuilder.append("&" + URLEncoder.encode("sgguCd","UTF-8") + "=" + URLEncoder.encode("110019", "UTF-8")); /*시군구코드*/
            urlBuilder.append("&" + URLEncoder.encode("emdongNm","UTF-8") + "=" + URLEncoder.encode("신내동", "UTF-8")); /*읍면동명*/
            urlBuilder.append("&" + URLEncoder.encode("yadmNm","UTF-8") + "=" + URLEncoder.encode("서울의료원", "UTF-8")); /*병원명(UTF-8 인코딩 필요)*/
            urlBuilder.append("&" + URLEncoder.encode("zipCd","UTF-8") + "=" + URLEncoder.encode("2010", "UTF-8")); /*분류코드(활용가이드 참조)*/
            urlBuilder.append("&" + URLEncoder.encode("clCd","UTF-8") + "=" + URLEncoder.encode("11", "UTF-8")); /*종별코드(활용가이드 참조)*/
            urlBuilder.append("&" + URLEncoder.encode("dgsbjtCd","UTF-8") + "=" + URLEncoder.encode("01", "UTF-8")); /*진료과목코드(활용가이드 참조)*/
            urlBuilder.append("&" + URLEncoder.encode("xPos","UTF-8") + "=" + URLEncoder.encode("127.09854004628151", "UTF-8")); /*x좌표(소수점 15)*/
            urlBuilder.append("&" + URLEncoder.encode("yPos","UTF-8") + "=" + URLEncoder.encode("37.6132113197367", "UTF-8")); /*y좌표(소수점 15)*/
            urlBuilder.append("&" + URLEncoder.encode("radius","UTF-8") + "=" + URLEncoder.encode("3000", "UTF-8")); /*단위 : 미터(m)*/
            URL url = new URL(urlBuilder.toString());
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-type", "application/json");
            System.out.println("Response code: " + conn.getResponseCode());
            BufferedReader rd;
            if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            } else {
                rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
            }
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line);
            }
            rd.close();
            conn.disconnect();
            System.out.println(sb.toString());
        }
    }

     

    포털에서 제공하는 샘플 코드는 위와 같다.

     

    근데 위 코드에 그대로 인증키만 넣고 테스트하니 오류가 났다.

     

    활용신청을 하면 포털에서 바로 테스트 해볼 수 있다.

     

     

    미리보기를 누르면 

     

    이렇게 xml 형식으로 응답이 온다. 

     

    안드로이드 스튜디오에서 보내는 url을 로그로 찍어서 브라우저에서 보낸 리퀘스트의 url과 비교해봤다.

     

    Log.d("test",urlBuilder.toString());

     

    이렇게 하니 실제로 안드로이드 스튜디오에서 보낸 url에는 "=서비스키" 부분이 추가되어있었다.

     

    그래서 그 부분을 삭제하고 또

     

     

    인증키를 밑에있는 Decoding을 써야한다.

     

    아마 샘플코드에서 URLEncoder.encode 를 통해 인코딩해서 보내기 때문인듯 하다.

     

     

    받을 응답을 로그로 찍어봤다. 잘 나온다.

     

    이제 이 데이터를 파싱해서 이쁘게 나타내야 한다.

Designed by Tistory.