728x90
반응형
날씨 앱 만들기 위해서 이번에 기상청 API를 호출할 필요가 있어서 해당 API를 사용했지만
아래와 같은 문제가 발생했다.
내가 날씨를 알고 싶은 날짜의 최고온도와 최저 온도를 알려면 전날 23시에 해당 날짜의 모든 시간대의 날씨정보를
호출해와야지만 최고 온도와 최저온도를 받아볼수 있다.
즉 내가 2021/10/13 일의 최고 온도와 최저 온도를 볼려면 2021/10/12 일 23시에 13일의 전체 날씨정보를 받아와야지만 최고 온도와 최저온도를 받아올수가 있다.
나는 매번 하루 전체의 날씨 정보를 받아오는 작업이 불필요하다고 생각해 내가 API를 호출해서 해당 날짜의 최고온도와 최저 온도를 저장해 API를 통해서 받아오자 라고 생각했다.
그래서 나는 우리나라의 모든 위치 정보를 기반으로 해당 날짜의 최고온도와 최저온도를 구해
내가 만든 서버에다가 저장을 해 API를 제공할 생각이다.
그러기 위해선 일단 로컬에서 API를 호출해 최저 온도와 최고 온도를 뽑아서 테스트 해보려고 한다.
그럼 일단 이클립스에서 기상청 API를 호출하는 소스를 보자.
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.IOException;
public class ShortWeather {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
final String URL = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst";
String serviceKey = "인코딩된 서비스키";
String pageNo = "1";
String numOfRows = "12";
String dataType = "json";
String base_date = "20211012";
String base_Time = "2300";
String nx = "55";
String ny = "127";
StringBuilder urlBuilder = new StringBuilder(URL); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "="+serviceKey); /*Service Key*/
urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode(pageNo, "UTF-8")); /*페이지번호*/
urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode(numOfRows, "UTF-8")); /*한 페이지 결과 수*/
urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(dataType, "UTF-8")); /*요청자료형식(XML/JSON) Default: XML*/
urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(base_date, "UTF-8")); /*‘21년 6월 28일 발표*/
urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(base_Time, "UTF-8")); /*06시 발표(정시단위) */
urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(nx, "UTF-8")); /*예보지점의 X 좌표값*/
urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(ny, "UTF-8")); /*예보지점의 Y 좌표값*/
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
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();
System.out.println(sb.toString());
}
}
위 소스는 사이트에서 제공해주는 샘플코드에서 변수 부분만 수정해서 받아온 것이다.
위 소스의 결과는 아래와 같다.
Response code: 200
{"response":{"header":{"resultCode":"00","resultMsg":"NORMAL_SERVICE"},"body":{"dataType":"JSON","items":{"item":[{"baseDate":"20211012","baseTime":"2300","category":"TMP","fcstDate":"20211013","fcstTime":"0000","fcstValue":"15","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"UUU","fcstDate":"20211013","fcstTime":"0000","fcstValue":"-1.1","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"VVV","fcstDate":"20211013","fcstTime":"0000","fcstValue":"-1.5","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"VEC","fcstDate":"20211013","fcstTime":"0000","fcstValue":"39","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"WSD","fcstDate":"20211013","fcstTime":"0000","fcstValue":"1.9","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"SKY","fcstDate":"20211013","fcstTime":"0000","fcstValue":"4","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"PTY","fcstDate":"20211013","fcstTime":"0000","fcstValue":"0","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"POP","fcstDate":"20211013","fcstTime":"0000","fcstValue":"30","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"WAV","fcstDate":"20211013","fcstTime":"0000","fcstValue":"0","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"PCP","fcstDate":"20211013","fcstTime":"0000","fcstValue":"강수없음","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"REH","fcstDate":"20211013","fcstTime":"0000","fcstValue":"75","nx":55,"ny":127},{"baseDate":"20211012","baseTime":"2300","category":"SNO","fcstDate":"20211013","fcstTime":"0000","fcstValue":"적설없음","nx":55,"ny":127}]},"pageNo":1,"numOfRows":12,"totalCount":882}}}
이렇게 보면 String 형태로 출력을 했기때문에 보기가 매우 불편하다.
그래서 해당 소스를 JSON으로 형식처럼 보기 좋게 출력을 Part2에서 해보려고 한다.
Part2는 추후에 완료된다면 바로 여기에 링크를 올릴 예정이다.
반응형
'코딩일기 > 날씨앱 만들기 프로젝트' 카테고리의 다른 글
[Spring] Spring 설치 및 MVC 프로젝트 구조 설명 Part1 (0) | 2021.10.15 |
---|---|
[Java] Maven 설명 및 설치 방법 (0) | 2021.10.13 |
[Tomcat] Tomcat 이클립스 연동 (0) | 2021.10.11 |
[Tomcat] Tomcat 9 설치 (0) | 2021.10.11 |
[리눅스 / Ubuntu] Ubuntu(리눅스)에 Java 11 설치 방법 (0) | 2021.10.05 |