Java 애플리케이션과 URL 간의 연결과 관련한 모든 클래스의 수퍼 클래스
URLConnection의 클래스는 일반적인 URL에 대한 API를 제공하고 , 서비 클래스인 HttpURLConnection는 HTTP 고유의 기능에 대한 추가 지원을 제공한다.
두 클래스 모두 추상 클래스 이므로 , URLConnection 및 HttpURL Connection의 새 인스턴스를 직접 만들 수 없다. 대신 URL 객체에서 연결을 통해 URLConnection의 인스턴스를 얻는다.
일반적으로 클라이언트 프로그램은 URL을 통해 서버와 통신할 때 다음 단계를 따른다.
1) URL 객체 만들기
2) URL에서 URLConnection 객체 얻기
3) URL 연결 구성 (선택사항)
4) 헤더 필드 읽기 (선택사항)
5) 입력 스트림 가져오기 및 데이터 읽기 (선택사항)
6) 출력 스트림 가져오기 및 데이터 읽기 (선택사항)
7) 연결 닫기
URL url = new URL("https://www.haeni.co.kr/api/v1/auth"); // 호출할 외부 API 를 입력한다.URLConnection 인스턴스는 URL 객체의 openConnection() 메소드 호출에 의하여 얻어진다.
프로코톨이 http:// 인 경우 , 반환된 객체를 HttpURLConnection 객체로 캐스팅할 수 있다.
URL 객체 생성 시, URL 형식이 잘못된 경우 MalformedURLException을 throw한다.
해당 예외는 IOException의 하위 클래스다.
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
실제로 연결을 설정하기 전에 타임아웃 , 캐시 , HTTP 요청 방법 등과 같이 클라이언트와 서버 간의 다양한 옵션을 설정할 수 있다.
setRequestMethod(String method)
: HTTP 메소드 GET , POST , HEAD , OPTIONS , PUT , DELETE , TRACE 중 하나인 URL 요청에 대한 메소드를 설정한다. (기본값은 GET)
setRequestProperty(String ket ,String value)
: key=value 쌍으로 지정된 일반 요청 속성을 설정한다. 키가 있는 속성이 이미 있는 경우 이전 값을 새 값으로 적용한다.
setDoOutput(boolean doOutput)
: URLConnection이 서버에 데이터를 보내는데 사용할 수 있는지 여부를 설정한다. (기본값은 false)
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json"); //json으로 message를 전달하고자 할 때
conn.setRequestProperty("X-Test-Token", params.get("accessToken").toString());
conn.setDoOutput(true);
URL 연결을 출력용으로 사용하려는 경우 DoOutput 플래그를 true로 설정해야 한다.
conn.setDoOutput(true);
URL 연결과 관련된 출력 스트림 객체를 가져온 다음 데이터를 쓴다.
getOutputStream() 메소드는 IOException 또는 UnknownServiceException을 throw 할 수 있다.
OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream());
jsonStr = gson.toJson(params.get("req_data")); // string -> jsonString
os.write(jsonStr);
os.flush();
🔔 OutputStreamWriter
.write() 메서드를 통해서 출력 URL 연결에서 입력 스트림 인스턴스를 얻은 다음 데이터를 읽는다.
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line.trim());
}
HTTP 상태 코드가 400보다 큰 경우 getErrorStream()으로 오류 메세지를 읽을 수 있다.
br = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8"));
🔔 BufferedReader
.readLine() 메서드를 사용하면 데이터 라인 단위로 읽을 수 있음 close() 메소드를 호출하거나 , HttpURLConnection 객체에서 disconnect() 메소드를 호출한다.close()를 사용해서 연결을 종료하는 경우, 다시 연결하려면 openConnection()을 다시 해줘야 한다.disconnect()를 사용해서 연결을 종료하는 경우, connect() 메소드만 호출하면 바로 복구된다. os.close();
br.close();
conn.disconnect();출처
https://lima1016.tistory.com/11
https://goddaehee.tistory.com/161
https://blueyikim.tistory.com/2199
https://digitalbourgeois.tistory.com/57
https://new-hero.tistory.com/5
https://blog.acronym.co.kr/537
http://daplus.net/java-java%EC%97%90%EC%84%9C-%EC%98%A4%EB%A5%98-%EC%9D%91%EB%8B%B5-%EB%B3%B8%EB%AC%B8-%EC%9D%BD%EA%B8%B0/
https://canworld42.tistory.com/180
https://ssamlee.tistory.com/10