공공데이터포털 OPEN API 사용하기
준비사항
먼저 회원가입을 진행합니다.
유치원 정보를 알아보기 위해 유치원 현황 데이터를 선택했습니다.
인증키를 확인합니다.
SAMPLE URL 예시가 나와있습니다. 저는 서울 도봉구 유치원에 현황을 알아보도록 하겠습니다.
요청인자를 넣어서 URL을 만든 뒤 요청을 하였더니 데이터가 나옵니다.
구현하기
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.mainproject.be28.home;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
public class KinderDetail {
public static void main(String[] args) {
String key = 인증키;
String result = "";
try {
String apiURL = "https://e-childschoolinfo.moe.go.kr/api/notice/basicInfo2.do?key="
+ key + "&sidoCode=11" + "&sggCode=11320";
URL url = new URL(apiURL);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestProperty("Accept-Charset", "UTF-8");
BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
result = input.readLine();
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(result);
// "kinderInfo" 배열 가져오기
JSONArray kinderInfoArray = (JSONArray) jsonObject.get("kinderInfo");
// 배열 순회
for (Object kinderObj : kinderInfoArray) {
JSONObject kinder = (JSONObject) kinderObj;
// 필요한 데이터 추출
String kindername = (String) kinder.get("kindername");
String establish = (String) kinder.get("establish");
String edate = (String) kinder.get("edate");
String addr = (String) kinder.get("addr");
String telno = (String) kinder.get("telno");
String opertime = (String) kinder.get("opertime");
String clcnt3 = (String) kinder.get("clcnt3");
String clcnt4 = (String) kinder.get("clcnt4");
String clcnt5 = (String) kinder.get("clcnt5");
String rppnname = (String) kinder.get("rppnname");
// 원하는 형태로 출력
System.out.println("유치원명: " + kindername);
System.out.println("설립유형: " + establish);
System.out.println("설립일자: " + edate);
System.out.println("주소: " + addr);
System.out.println("전화번호: " + telno);
System.out.println("운영시간: " + opertime);
System.out.println("3세 학급 수: " + clcnt3);
System.out.println("4세 학급 수: " + clcnt4);
System.out.println("5세 학급 수: " + clcnt5);
System.out.println("원장명: " + rppnname);
System.out.println("------------------------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// API 키를 저장할 변수 key와 API 응답을 저장할 빈 문자열 result를 선언합니다.
// API URL을 구성하고 연결을 열며 요청 속성을 설정하고 API 응답을 읽습니다.
// JSON 응답을 파싱하고 "kinderInfo"라는 배열을 만들며 반복문으로 정보를 추출합니다.
오류
1
2
3
4
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
이 오류는 SSL/TLS 인증서 검증에서 발생한 문제라고 합니다.
Java 프로그램이 신뢰할 수 있는 인증 경로를 찾지 못했을 때 발생한다고 합니다.
해결할 수 있는 방법이 많지만 임시적으로 SSL 인증서 검증 비활성화하도록 하겠습니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.mainproject.be28.home;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
public class KinderDetail {
public static void main(String[] args) {
String key = "인증키";
String result = "";
try {
disableSSLVerification();
String apiURL = "https://e-childschoolinfo.moe.go.kr/api/notice/basicInfo2.do?key="
+ key + "&sidoCode=11" + "&sggCode=11320";
URL url = new URL(apiURL);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestProperty("Accept-Charset", "UTF-8");
BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
result = input.readLine();
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(result);
// "kinderInfo" 배열 가져오기
JSONArray kinderInfoArray = (JSONArray) jsonObject.get("kinderInfo");
// 배열 순회
for (Object kinderObj : kinderInfoArray) {
JSONObject kinder = (JSONObject) kinderObj;
// 필요한 데이터 추출
String kindername = (String) kinder.get("kindername");
String establish = (String) kinder.get("establish");
String edate = (String) kinder.get("edate");
String addr = (String) kinder.get("addr");
String telno = (String) kinder.get("telno");
String opertime = (String) kinder.get("opertime");
String clcnt3 = (String) kinder.get("clcnt3");
String clcnt4 = (String) kinder.get("clcnt4");
String clcnt5 = (String) kinder.get("clcnt5");
String rppnname = (String) kinder.get("rppnname");
// 원하는 형태로 출력
System.out.println("유치원명: " + kindername);
System.out.println("설립유형: " + establish);
System.out.println("설립일자: " + edate);
System.out.println("주소: " + addr);
System.out.println("전화번호: " + telno);
System.out.println("운영시간: " + opertime);
System.out.println("3세 학급 수: " + clcnt3);
System.out.println("4세 학급 수: " + clcnt4);
System.out.println("5세 학급 수: " + clcnt5);
System.out.println("원장명: " + rppnname);
System.out.println("------------------------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void disableSSLVerification() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
}};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
}
결과
결과가 잘 나왔습니다!!
아쉬운점
php를 이용해서 프론트에 보이게 구현해봐도 좋을 것 같다.
SSL/TLS 인증서 검증에 대해서 공부해야겠다
This post is licensed under CC BY 4.0 by the author.