프로그래밍/API
[JAVA] 기상청 날씨 api - 예보버전조회
밍구몬
2019. 8. 23. 13:41
기존 (신)동네예보정보조회서비스와 중기예보정보조회서비스는 2020년 4월 28일 폐기.
기상청 API는 아래의 링크 확인
https://ming9mon.tistory.com/151https://ming9mon.tistory.com/151
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class Test {
public static void main(String[] args) throws IOException, ParseException {
//String date=request.getParameter("date");
Date d = new Date();
SimpleDateFormat f1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat f2 = new SimpleDateFormat("HH");
String date = f1.format(d);
String time = Integer.parseInt(f2.format(d))-1+"00";
int idx=0;
if(Integer.parseInt(time) < 1000) time="0"+time;
String apiUrl = "http://newsky2.kma.go.kr/service/SecndSrtpdFrcstInfoService2/ForecastVersionCheck";
// 홈페이지에서 받은 키
String serviceKey = "HeczJdNPgPuFSyaZHxwLvi8aTJpiw8N0MuZYw2WP0MzAtnquzAcgjzuwy8PUZGd1Mc01lmWEycSzA6WElvzX9A%3D%3D";
String ftype = "VSRT"; //-VSRT: 초단기예보 -ODAM: 동네예보 -SHRT: 초단기 실황
if (ftype.equals("ODAM")) idx=1;
String baseDateTime = timeCalc(date,time,idx);// 각각의 base_time으로 조회
String type = "json";
StringBuilder urlBuilder = new StringBuilder(apiUrl);
urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "="+serviceKey);
urlBuilder.append("&" + URLEncoder.encode("basedatetime","UTF-8") + "=" + URLEncoder.encode(baseDateTime, "UTF-8")); //조회하고싶은 날짜
urlBuilder.append("&" + URLEncoder.encode("ftype","UTF-8") + "=" + URLEncoder.encode(ftype, "UTF-8")); //버전 조회 종류
urlBuilder.append("&" + URLEncoder.encode("_type","UTF-8") + "=" + URLEncoder.encode(type, "UTF-8")); //타빕
//GET방식으로 전송해서 파라미터 받아오기
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
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();
String data= sb.toString();
// Json parser를 만들어 만들어진 문자열 데이터를 객체화
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject) parser.parse(data);
// response 키를 가지고 데이터를 파싱
JSONObject parse_response = (JSONObject) obj.get("ForecastVersionAPIResponse");
// response 로 부터 body 찾기
JSONObject parse_body = (JSONObject) parse_response.get("body");
// body 로 부터 item 찾기
JSONObject item = (JSONObject) parse_body.get("item");
System.out.println(item);
Object dateTime = item.get("basedatetime");
Object version = item.get("version");
System.out.println("daseDate\t: "+dateTime);
System.out.println("버전\t\t: "+version);
}
private static String timeCalc(String date,String time,int idx){
int d=Integer.parseInt(date);
int t=Integer.parseInt(time);
int[] apiTime = new int[] {210,510,810,1110,1410,1710,2110};
/**
* baseTime 맞추기
*
* 초단기에보--
* API제공 시간은 H시+45분
* 30분 단위 제공
* baseTime : H시
*
* 동네예보 --
* baseTime = 0200, 0500, 0800, 1100, 1400, 1700, 2100
* API 제공시간 = baseTime+10
* API 제공시간인 0210분 이전시간이면 전날 23시로 세팅
*
*/
if(idx == 0){
if(t%100 < 45){
if(t<100){
t=2300;
}else{
t-=100;
}
}
t = t / 100 * 100; //시간만 남기기
}else if(idx == 1){
for(int i=0;i<apiTime.length;i++) {
if(t <= apiTime[i]) {
if(t < 210) {
d-=1;
t=2300;
break;
}
//apiTime - 10 = baseTime
t= apiTime[i-1]-10;
break;
}
}
}
if(t==0)
return d+"0000";
else if(t<1000)
return d+"0"+t;
else
return d+""+t;
}
}