본문 바로가기
프로그래밍/API

[JAVA] 기상청 날씨 api - 예보버전조회

by 밍구몬 2019. 8. 23.

기존 (신)동네예보정보조회서비스 중기예보정보조회서비스는 2020년 4월 28일 폐기.

기상청 API는 아래의 링크 확인

https://ming9mon.tistory.com/151https://ming9mon.tistory.com/151

 

 

[JAVA]변경된 기상청 날씨 API (동네예보, 중기예보)

기존에 사용하던 (신)동네예보정보조회서비스와 중기예보정보조회서비스는 2020년 4월 28일 완전히 폐기된다고 합니다. 새로운 API는 https://www.data.go.kr/dataset/15000099/openapi.do 에서 동네예보 조회서비..

ming9mon.tistory.com

 

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;
	}
}