프로그래밍/API

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

밍구몬 2020. 4. 7. 14:23

새로운 API는 https://www.data.go.kr/dataset/15000099/openapi.do 에서 동네예보 조회서비스중기예보 조회서비스를 활용신청 하시면 됩니다.

(한 페이지에 동네예보 조회 서비스와 중기예보 조회서비스 다 있는데 중기예보 조회는 아래로 쭉 내려야 보입니다 ..)

 

활용 신청을 누르고 시스템 유형, 활용정보, 상세기능정보(모르면 다 선택)를 선택해 주시면 됩니다.

 

동네예보 또는 중기예보를 활용신청 후 들어가보면 아래와 같이 나옵니다.

End Point는 API의 URL이며, Key는 동네예보와 중기예보가 같습니다. 

(모든 개발 및 테스트가 끝나면 운영계정으로 변경해 주시면 되고, 2년마다 연장신청을 해주셔야 합니다.)

이전에는 활용신청을 하고 몇시간 뒤에 사용을 할 수 있었는데, 바뀐 API도 그런지는 모르겠으니 안된다면 조금 기다린 후 다시 시도해 보시면 됩니다.

각 API의 baseTime 및 코드값 정보는 참고문서에 있으니 상세한 내용은 파일을 다운받아 확인하시면 됩니다.

 

상세기능 정보에서 테스트가 가능합니다.

 

동네예보의 기상청 nx, ny 좌표 얻기 : https://ming9mon.tistory.com/83

 

Java : 기상청 좌표 얻기

이전 글에서는 사용법을 알아 보았고, 이번 글에서는 기상청 api를 사용하기 위한 파라미터 x좌표와 y좌표를 얻기 위한 방법을 포스팅 하겠다. http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt 위 사이트에..

ming9mon.tistory.com

 

동네예보 조회서비스

더보기

동네예보의 파라미터는 ServiceKey, pageNo, numOfRows, dataType, base_date, base_time, nx, ny 가 필요하며, 굵은 글씨는 필수 파라미터) 입니다.

 

동네예보의 BastTime은 다음과 같으며,

초단기 예보는 의 BaseTime은 다음과 같습니다.

(초단기예보는 시간마다 주는 데이터 양이 다름. 상세 내용은 개발문서 확인)

예보 별 Return 값은 예보마다 다르며, 개발 문서에 나와있습니다.

 

동네예보 기능 별 URL

 

초단기실황조회 : http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst

초단기예보조회 : http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtFcst

동네예보조회 : http://apis.data.go.kr/1360000/VilageFcstInfoService/getVilageFcst

예보버전조회 : http://apis.data.go.kr/1360000/VilageFcstInfoService/getFcstVersion

 

 JAVA 코드

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.JSONArray;
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 {
		// TODO Auto-generated method stub
		
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

		//String apiUrl = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst";	//초단기실황조회
		//String apiUrl = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtFcst";	//초단기예보조회
		String apiUrl = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getVilageFcst";	//동네예보조회
		
		// 홈페이지에서 받은 키
		String serviceKey = "홈페이지에서 받은 API 키";
		String nx = "60";	//위도
		String ny = "127";	//경도
		String baseDate = sdf.format(date);	//조회하고싶은 날짜
		String baseTime = "0800";	//API 제공 시간
		String dataType = "json";	//타입 xml, json
		String numOfRows = "250";	//한 페이지 결과 수 

		//동네예보 -- 전날 05시 부터 225개의 데이터를 조회하면 모레까지의 날씨를 알 수 있음
		
		StringBuilder urlBuilder = new StringBuilder(apiUrl);
		urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "="+serviceKey);
		urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(nx, "UTF-8")); //경도
		urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(ny, "UTF-8")); //위도
		urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(baseDate, "UTF-8")); /* 조회하고싶은 날짜*/
		urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(baseTime, "UTF-8")); /* 조회하고싶은 시간 AM 02시부터 3시간 단위 */
		urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(dataType, "UTF-8"));	/* 타입 */
		urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode(numOfRows, "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("response"); 
		// response 로 부터 body 찾기
		JSONObject parse_body = (JSONObject) parse_response.get("body"); 
		// body 로 부터 items 찾기 
		JSONObject parse_items = (JSONObject) parse_body.get("items");
		JSONArray parse_item = (JSONArray) parse_items.get("item");
		//JSONObject item = (JSONObject) parse_item.get("item");

		System.out.println(data);
		for(int i=0;i<parse_item.size();i++) {
			System.out.println(parse_item.get(i));
		}
		
        
	}
}

 

위 소스는 API를 통해 JSON 데이터를 받아오는 예제입니다.

serviceKey만 홈페이지에서 받은 키로 변경하시면 테스트 가능합니다.

기존 API와 달라진것은 파라미터명 정도인것 같습니다.

json으로 요청하여 item까지 파싱을 하는 예제이니 나머지 데이터는 필요에 따라 가공하여 사용하시면 될 것 같습니다.

 

*위 예제에는 jackson라이브러리를 사용하였으니 테스트 하실 때 프로젝트에 jackson 라이브러리를 추가해 주셔야 됩니다.

 

중기예보 조회서비스

더보기

중기예보 조회서비스는 파라미터명이 다른 경우도 있고, 기능 별로 코드가 다르므로 API활용 가이드 첨부파일을 다운받아 확인하셔야 됩니다.

(tmFc 는 발표 시각이며, 일 2회 생성 됩니다.(06시 18시))

 

중기예보 기능 별 URL

중기전망조회 : http://apis.data.go.kr/1360000/MidFcstInfoService/getMidFcst 

중기육상예보조회 : http://apis.data.go.kr/1360000/MidFcstInfoService/getMidLandFcst

중기중기기온조회 : http://apis.data.go.kr/1360000/MidFcstInfoService/getMidTa

중기해상예보조회 : http://apis.data.go.kr/1360000/MidFcstInfoService/getMidSeaFcst

 

중기예보조회 JAVA 코드

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.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class GetAreaCode {

	public static void main(String[] args) throws IOException, ParseException {
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

		String apiUrl = "http://apis.data.go.kr/1360000/MidFcstInfoService/getMidTa";	//중기기온조회
		
		// 홈페이지에서 받은 키
		String serviceKey = "API 키 입력";
		String regId = "11B10101";	//예보 구역 코드
		String tmFc = sdf.format(date)+"0600";	//발표시각 입력
		String dataType = "json";	//타입 xml, json
		String numOfRows = "250";	//한 페이지 결과 수 

		StringBuilder urlBuilder = new StringBuilder(apiUrl);
		urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "="+serviceKey);
		urlBuilder.append("&" + URLEncoder.encode("regId","UTF-8") + "=" + URLEncoder.encode(regId, "UTF-8"));
		urlBuilder.append("&" + URLEncoder.encode("tmFc","UTF-8") + "=" + URLEncoder.encode(tmFc, "UTF-8")); /* 조회하고싶은 날짜*/
		urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode(numOfRows, "UTF-8")); /* 조회하고싶은 시간 AM 02시부터 3시간 단위 */
		urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(dataType, "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("response"); 
		// response 로 부터 body 찾기
		JSONObject parse_body = (JSONObject) parse_response.get("body"); 
		// body 로 부터 items 찾기 
		JSONObject parse_items = (JSONObject) parse_body.get("items");
		JSONArray parse_item = (JSONArray) parse_items.get("item");
		//JSONObject item = (JSONObject) parse_item.get("item");

		System.out.println(data);
		System.out.println(parse_item);
	}
}