본문으로 바로가기

[기상청 API] 종관기상관측 사용하기

category JAVA 2019. 6. 14. 14:00
반응형

기상청 동네예보조회 서비스 연동에 이어 종관기상 관측 API 연동완료!

 

종관기상 관측 API 데이터는 일사량 일조량 지면온도 등 동네예보조회 데이터보다 추가된 데이터가 많다.

 

종관기상 관측 API 연동할 때 제일 큰 문제는 HTTP 로 호출은 하지만 HTTPS 로 리다이렉트 되어 302 ERROR 가 나타나는 것이었다.. 해결하려고 구글링도 하고. 문의도 해보고 몇일동안 고생하다. 

아래 소스코드에 적혀있는 함수를 발견하고 사용하니 HTTPS 바로 호출을 할 수 있었다.

아직은 많이 실력이 많이 부족하다는 걸 다시한번 느꼈고 지속적으로 공부해야 겠다.

 

어제시간을 가져와서 호출하는 이유는 기상청에서 데이터를 어제 자 데이터만 공유해주기 때문이다..

아마도 오늘 자 데이터는 이상 있는지 없는지 확인하고 보내주는 듯 한다..(다음날에)

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
 
 
 
 
class PVWeather{
    
    /***********************************************************
     * 어제시간 가져오기
     * @return
     * *********************************************************/
    public String fn_Yesterday() 
    {
        SimpleDateFormat Format = new SimpleDateFormat("yyyyMMdd HH");
        Calendar cal = Calendar.getInstance();
        
        cal.add(Calendar.DATE,-1);
        String timedate = Format.format(cal.getTime());
        
        return timedate;
    }
    
    /*******************************************************************************
     * 필요데이터: 어제날짜 및 시간, 서비스키
     * stnIds = 기상 관측소 코드 (기상관측위치에 따라 데이터 가져옴)
     * 기상청 API 정책 상 어제데이터를 가져옴
     * @param startDt
     * @param startHh
     * @param endDt
     * @param endHh
     * @return
     * ******************************************************************************/
    public String fn_PVConnect(String startDt, String startHh, String endDt, String endHh)
    {
        BufferedReader br;
        String Connect = "";
        String apikey = "서비스키";
        
                   + "&startDt=" + startDt + "&startHh=" + startHh + "&endDt=" + endDt + "&endHh=" + endHh + "&stnIds=108&schListCnt=10&pageIndex=1&apiKey=" + apikey ;
        
            try {
                
                URL url = new URL(add);
                HttpsConnect();
            
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Content-type""application/json");
                if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300)
                {
                    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    
                }
                else 
                {
                    br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
                }
                
                String ResData = br.readLine();
                
                if(ResData == null
                {
                    System.out.println("응답데이터 == NULL");
                }
                else 
                {
                    
                    Connect = fn_Json(ResData);
                    
                }
                br.close();
                conn.disconnect();
            }catch(Exception e) 
            {
                System.out.println(e.getMessage());
            }
            
            return Connect;
            }
    
    /****************************************************************************
     * JSON 데이터 파싱함수
     * 데이터 추출
     * @param Data
     * **************************************************************************/
    public String fn_Json(String Data) 
    {
        
        JSONArray PVWeatherData;
        JSONObject infoList;
        String info = "";
        String date = "";
        String icsr = ""//일사량
        String ij = "";   //일조량
        String Value = "";
        String ts = ""//지면온도
        String stn_id = ""//지점번호
        String stn_nm = "";
        try {
            
            JSONParser parsar = new JSONParser();
            
            JSONArray obj = (JSONArray) parsar.parse(Data);
            JSONObject AData = (JSONObject) obj.get(3);
                
            PVWeatherData = (JSONArray) AData.get("info");
            for(int i = 0; i< PVWeatherData.size(); i++) { 
            
            infoList = (JSONObject) PVWeatherData.get(i);
            
            date = infoList.get("TM").toString();
            icsr = infoList.get("ICSR").toString();
            ij = infoList.get("SS").toString();    
            ts = infoList.get("TS").toString();    
            stn_id = infoList.get("STN_ID").toString();
            stn_nm = infoList.get("STN_NM").toString();
            
        
            date  = "날짜: " + date;
            icsr = "일사량: " + icsr;
            ij = "일조량: " + ij;
            ts = "지면온도: " + ts;
            stn_nm = "지역 명: " + stn_nm;
            stn_id = "지역 코드: " + stn_id;
            Value += date + ","  + icsr + "," + ij +  "," + ts + "," + stn_nm  + "," +stn_id  + ","
            }
            
            
        }catch(Exception e) {
            e.getMessage();
        }
        
        return Value;
    }
    
    /****************************************************************************
     * HTTP -> HTTPS 연결 도와주는 함수(리다이렉트)
     * 302 REDIRECT 에러 해결
     * **************************************************************************/
    public void HttpsConnect() 
    {
        try {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
                return null; } 
 
            public void checkClientTrusted(X509Certificate[] certs, String authType) { 
            } 
 
            public void checkServerTrusted(X509Certificate[] certs, String authType) { 
 
            } 
        } };
 
        SSLContext sc = SSLContext.getInstance("SSL"); 
        sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
             public boolean verify(String string,SSLSession ssls) {
                    return true;
             }
         });
        }catch(Exception e) 
        {
            System.out.println(e);
        }
        
    }
        
}
 
 
public class Weatherc {
 
    public static void main(String[] args) throws IOException{
        
        PVWeather pv = new PVWeather();
        String PVresponse = "";
        String[] PVArray ;
        String yes = pv.fn_Yesterday();
        String Yester = yes.substring(08);
        String HH = yes.substring(9,11);
        String TT = "09";
        
        PVresponse = pv.fn_PVConnect(Yester, TT, Yester, HH);
        PVArray = PVresponse.split(",");
        for(int i =0; i< PVArray.length; i++) {
        System.out.println(PVArray[i]);
        }
    
        
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs
반응형