-
공공데이터 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 를 통해 인코딩해서 보내기 때문인듯 하다.
받을 응답을 로그로 찍어봤다. 잘 나온다.
이제 이 데이터를 파싱해서 이쁘게 나타내야 한다.
'Java > Android Studio' 카테고리의 다른 글
XML 형식의 데이터 파싱, 검색기능 구현 (2) 2021.07.17 액티비티 간 전환하기 (2) 2021.06.27 pt.1~3)안드로이드 스튜디오 계산기 (프로젝트 생성부터 완성까지!) (3) 2020.09.10 안드로이드 스튜디오 계산기(3): CalculateHelper 클래스 추가, 빌드 (0) 2020.09.10 안드로이드 스튜디오 계산기(2): 레이아웃,버튼 추가, MainActivity (0) 2020.09.10