Java - URLConnection & Open API weather

강서진·2023년 11월 20일
0

Java

목록 보기
28/35
post-custom-banner

강좌 Course 2. Part 3. ch1 5강 요약

URLConnection

HttpURLConnection 은 URLConnection의 하위 클래스로, HTTP 프로토콜을 사용하여 특정 웹 서버와 통신한다. HTTP 메서드 GET, POST, PUT, DELETE 등을 지원하며, HTTP 요청과 응답을 처리할 수 있는 메서드들을 제공한다.

HttpURLConnection을 사용하여 웹 서버에서 정보를 가져오는 순서는 다음과 같다.

  1. URL 생성
  2. HttpURLConnection 초기화
    openConnection() 호출하여 객체 생성
  3. HTTP 메서드 설정(GET, POST, PUT, DELETE 등)
    setRequestMethod()로 설정
  4. 요청 헤더 설정(선택)
    setRequestProperty()로 설정
  5. 요청 본문 작성(선택)
    POST, PUT 등을 사용할 때 출력 스트림을 사용해 요청 본문 작성
  6. 응답 코드 확인
    getResponseCode()로 서버에서 반환한 응답코드확인
  7. 응답 헤더 읽기(선택)
    getHeaderField() 등으로 응답 헤더 확인
  8. 응답 본문 읽기
    InputStream으로 처리
  9. 연결 종료

Open API로 날씨정보 가져오기

HttpURLConnection API로 openweathermap.org에 접속해 날씨 정보를 가져올 수 있다.
사용하려면 회원가입해서 API key를 발급받아야 한다.

public class WeatherExample {
    public static void main(String[] args) {
        String apiKey = "발급받은 api 키";
        String city = "Seoul";
        // url query - 도시, api key, 섭씨변환
        String urlString = "https://api.openweathermap.org/data/2.5/weather?q="
        +city
        +"&appid="
        +apiKey
        +"&units=metric";

        try {
        	// URL 객체 (Java.net.URL)
            URL url = new URL(urlString);
            
            // 연결 & 형변환
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            
            // GET 메서드로 요청 보내기
            connection.setRequestMethod("GET");
            
           // JSON 형태로 응답 받겠다 명시
           	connection.setRequestProperty("Accept","application/json");
           
			// 응답 코드 받아 저장
            int responseCode = connection.getResponseCode(); // 200
            
            // 200 = 연결 성공
            if (responseCode == 200){
                
                // 입출력 스트림으로 연결
                // InputStreamReader: 데이터를 전달받는 통로. 1바이트씩 받는데, 한글은 2바이트여서 깨지기 때문에 Reader로 받음
                // BufferedReader는 데이터를 한 곳으로 모아 한 번에 처리함
                BufferedReader in = new BufferedReader(
                new InputStreamReader(
                connection.getInputStream()));
                
                String inputLine;
                
                // StringBuffer는 서버에서 라인 단위로 날아온 데이터 문자열을 합쳐 하나로 만들어줌
                StringBuffer content = new StringBuffer();
                
                // in의 데이터를 한 줄씩 읽고 inputLine에 저장(=끝까지 읽는다), 
                // 데이터를 StringBuffer에 저장.
                while ((inputLine=in.readLine()) != null){
                    content.append(inputLine);
                }
                in.close();
                System.out.println("content.toString() = "+content.toString());
                
                // Gson의 JsonParser 사용해 문자열을 JsonObject로 변환
                JsonObject weatherData = JsonParser.parseString(content.toString()).getAsJsonObject();
                
                // JsonObject의 main을 JsonObject로 꺼냄
                JsonObject mainData = weatherData.getAsJsonObject("main");
                
                // main에서 온도를 double로 꺼냄
                double temp = mainData.get("temp").getAsDouble();
                System.out.println("temp = " + temp);
                
                // 연결 종료
                connection.disconnect();

            } else {
                // wrong input?
            }

        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
post-custom-banner

0개의 댓글