강좌 Course 2. Part 3. ch1 5강 요약
HttpURLConnection 은 URLConnection의 하위 클래스로, HTTP 프로토콜을 사용하여 특정 웹 서버와 통신한다. HTTP 메서드 GET, POST, PUT, DELETE 등을 지원하며, HTTP 요청과 응답을 처리할 수 있는 메서드들을 제공한다.
HttpURLConnection을 사용하여 웹 서버에서 정보를 가져오는 순서는 다음과 같다.
- URL 생성
- HttpURLConnection 초기화
openConnection() 호출하여 객체 생성- HTTP 메서드 설정(GET, POST, PUT, DELETE 등)
setRequestMethod()로 설정- 요청 헤더 설정(선택)
setRequestProperty()로 설정- 요청 본문 작성(선택)
POST, PUT 등을 사용할 때 출력 스트림을 사용해 요청 본문 작성- 응답 코드 확인
getResponseCode()로 서버에서 반환한 응답코드확인- 응답 헤더 읽기(선택)
getHeaderField() 등으로 응답 헤더 확인- 응답 본문 읽기
InputStream으로 처리- 연결 종료
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();
}
}
}