URLConnection 및 HttpURLConnection 클래스
URLConnection 은 Java 애플리케이션과 URL 간의 연결을 나타내는 모든 클래스의 수퍼클래스입니다. URLConnection 클래스 는 일반 URL에 대한 API를 제공하고 하위 클래스인 HttpURLConnection 은 HTTP 관련 기능에 대한 추가 지원을 제공합니다.이 두 클래스는 모두 추상적입니다. 즉, URLConnection 및 HttpURLConnection 의 새 인스턴스를 직접 만들 수 없습니다 . 대신 URL 개체에서 연결을 열어 URLConnection 의 인스턴스를 얻습니다.일반적으로 클라이언트 프로그램은 URL을 통해 서버와 통신하는 다음 단계를 따릅니다.
- URL 개체 만들기
- URL에서 URLConnection 객체 얻기
- URLConnection 구성
- 헤더 필드 읽기
- 입력 스트림 가져오기 및 데이터 읽기
- 출력 스트림 가져오기 및 데이터 쓰기
- 연결 닫기
3~6단계는 선택 사항이며 5~6단계는 서로 바꿔 사용할 수 있습니다.이 시퀀스를 기반으로 URLConnection 및 HttpURLConnection 클래스 의 API를 살펴보겠습니다 .
1. URL 객체 생성
다음과 같이 주어진 URL에 대해 새 URL 객체를 생성하기만 하면 됩니다.
1
|
URL url = new URL("http://www.google.com");
|
이 생성자는 URL 형식이 잘못된 경우 MalformedURLException 을 throw합니다. 이 확인된 예외는 IOException 의 하위 클래스입니다 .
2. URL에서 URLConnection 객체를 얻습니다.
URLConnection 인스턴스는 URL 객체에서 openConnection() 메서드를 호출하여 얻 습니다 .
1
|
URLConnection urlCon = url.openConnection();
|
프로토콜이 http://인 경우 반환된 개체를 HttpURLConnection 개체 로 캐스팅할 수 있습니다 .
1
|
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
|
openConnection() 메서드 는 실제 네트워크 연결을 설정하지 않습니다. 그것은 단지 URLConnection 클래스 의 인스턴스를 반환합니다 .네트워크 연결은 connect() 메서드가 호출될 때 명시적으로 이루어지거나 헤더 필드를 읽거나 입력 스트림/출력 스트림을 가져올 때 암시적으로 이루어집니다.URL의 openConnection() 메서드는 I/O 오류가 발생하면 IOException 을 발생시킵니다.
3. URLConnection 구성
실제로 연결을 설정하기 전에 시간 초과, 캐시, HTTP 요청 방법 등과 같이 클라이언트와 서버 간의 지속적인 통신에 영향을 미치는 다양한 측면을 구성할 수 있습니다.URLConnection 클래스 는 연결을 구성하기 위해 다음 메서드를 제공합니다.
- setConnectTimeout (int timeout) : 연결 시간 초과를 밀리초 단위로 설정합니다. 연결 이java.net.SocketTimeoutException이 발생합니다. 시간 초과가 0이면 무한한 시간 초과(기본값)를 나타냅니다.
- setReadTimeout (int timeout) : 읽기 제한 시간을 밀리초 단위로 설정합니다. 제한 시간이 만료되고 연결의 입력 스트림에서 읽을 수 있는 데이터가 없으면SocketTimeoutException이 발생합니다. 시간 초과가 0이면 무한한 시간 초과(기본값)를 나타냅니다.
- setDefaultUseCaches (부울 기본값) :URLConnection이 기본적으로 캐시를 사용하는지 여부를 설정합니다(기본값은 true). 이 메서드는 URLConnection클래스의 향후 인스턴스에 영향을 줍니다
- setUseCaches (boolean useCaches) : 이 연결이 캐시를 사용하는지 여부를 설정합니다(기본값은 true).
- setDoInput (boolean doInput) : 이URLConnection을 서버에서 콘텐츠를 읽는 데 사용할 수 있는지 여부를 설정합니다(기본값은 true).
- setDoOutput (boolean doOutput) : 이URLConnection이 서버에 데이터를 보내는 데 사용할 수 있는지 여부를 설정합니다(기본값은 false).
- setIfModifiedSince (긴 시간) : 주로 HTTP 프로토콜에 대해 클라이언트가 검색한 콘텐츠의 마지막 수정 시간을 설정합니다. 예를 들어, 서버가 지정된 시간 이후에 콘텐츠가 변경되지 않았음을 발견하면 콘텐츠를 가져오지 않고 상태 코드 304 - 수정되지 않음을 반환합니다. 클라이언트는 지정된 시간보다 최근에 수정된 경우 새로운 콘텐츠를 받게 됩니다.
- setAllowUserInteraction (부울 허용) : 사용자 상호 작용을 활성화 또는 비활성화합니다. 예를 들어 필요한 경우 인증 대화 상자를 표시합니다(기본값은 false).
- setDefaultAllowUserInteraction (부울 기본값) : 이후의 모든 URLConnection객체에 대한 사용자 상호 작용의 기본값을 설정
- setRequestProperty (문자열 키, 문자열 값) : key=value 쌍으로 지정된 일반 요청 속성을 설정합니다. 키가 있는 속성이 이미 있는 경우 이전 값을 새 값으로 덮어씁니다.
이러한 메서드는 연결을 설정하기 전에 호출해야 합니다. 일부 메서드 는 연결이 이미 설정된 경우 IllegalStateException 을 발생시킵니다.또한 하위 클래스 HttpURLConnection 은 HTTP 관련 기능을 사용하여 연결을 구성하기 위한 다음 메서드를 제공합니다.
- setRequestMethod (String 메소드) : HTTP 메소드 GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE 중 하나인 URL 요청에 대한 메소드를 설정합니다. 기본 방법은 GET입니다.
- setChunkedStreamingMode (int chunkLength) : 콘텐츠 길이를 미리 알 수 없는 경우 내부 버퍼링 없이 HTTP 요청 본문을 스트리밍할 수 있습니다.
- setFixedLengthStreamingMode (long contentLength) : 콘텐츠 길이를 미리 알고 있는 경우 내부 버퍼링 없이 HTTP 요청 본문을 스트리밍할 수 있습니다.
- setFollowRedirects (boolean follow) : 이 정적 메서드는 HTTP 리디렉션 뒤에 이 클래스의 향후 개체가 자동으로 따라야 하는지 여부를 설정합니다(기본값은 true).
- setInstanceFollowRedirects (boolean follow) : HTTP 리디렉션 다음에 이HttpURLConnection클래스의 인스턴스가 자동으로 따라와야 하는지 여부를 설정합니다(기본값은 true).
위의 메소드는 setter입니다. 그리고 URLConnection 및 HttpURLConnection 클래스는 해당 getter도 제공합니다.
- getConnectTimeout()
- getReadTimeout()
- getDefaultUseCaches()
- getUseCaches()
- getDoInput()
- getDoOutput()
- getIfModifiedSince()
- getAllowUserInteraction()
- getDefaultAllowUserInteraction()
- getRequestProperty(문자열 키)
- getRequest메소드()
- getFollowRedirects()
- getInstanceFollowRedirects()
4. 헤더 필드 읽기
연결이 이루어지면 서버는 URL 요청을 처리하고 메타데이터와 실제 콘텐츠로 구성된 응답을 다시 보냅니다. 메타데이터는 헤더 필드라고 하는 키=값 쌍의 모음입니다.헤더 필드는 서버에 대한 정보, 상태 코드, 프로토콜 정보 등을 나타냅니다. 실제 내용은 문서 유형에 따라 텍스트, HTML, 이미지 등이 될 수 있습니다.URLConnection 클래스 는 헤더 필드를 읽기 위한 다음 메서드를 제공합니다.
- getHeaderFields () : 모든 헤더 필드를 포함하는 맵을 반환합니다. 키는 필드 이름이고 값은 해당 필드 값을 나타내는 문자열 목록입니다.
- getHeaderField (int n) : n 번째 헤더 필드의 값을 읽습니다.
- getHeaderField (문자열 이름) : 명명된 헤더 필드의 값을 읽습니다.
- getHeaderFieldKey (int n) : n 번째 헤더 필드의 키를 읽습니다.
- getHeaderFieldDate (문자열 이름, 긴 기본값) :Date. 필드가 없거나 값 형식이 잘못된 경우 기본값이 대신 반환됩니다.
- getHeaderFieldInt (String name, int default) : 정수로 구문 분석된 명명된 필드의 값을 읽습니다. 필드가 없거나 값 형식이 잘못된 경우 기본값이 대신 반환됩니다.
- getHeaderFieldLong (문자열 이름, 긴 기본값) : 긴 숫자로 구문 분석된 명명된 필드의 값을 읽습니다. 필드가 없거나 값 형식이 잘못된 경우 기본값이 대신 반환됩니다.
헤더 필드를 읽는 일반적인 방법입니다. 그리고 자주 액세스하는 일부 헤더 필드의 경우 URLConnection 클래스는 보다 구체적인 메서드를 제공합니다.
- getContentEncoding () : 콘텐츠의 인코딩 유형을 나타내는 콘텐츠 인코딩 헤더 필드의 값을 읽습니다.
- getContentLength () : 콘텐츠의 크기(바이트)를 나타내는 콘텐츠 길이 헤더 필드의 값을 읽습니다.
- getContentType () : 컨텐츠의 유형을 나타내는 컨텐츠 유형 헤더 필드의 값을 읽습니다.
- getDate () : 서버의 날짜 시간을 나타내는 날짜 헤더 필드의 값을 읽는다.
- getExpiration () : 만료 헤더 필드의 값을 읽고 응답이 오래된 것으로 간주되는 시간을 나타냅니다. 이것은 캐시 제어를 위한 것입니다.
- getLastModified () : 컨텐츠의 마지막 수정 시간을 나타내는 last-modified 헤더 필드의 값을 읽는다.
그리고 하위 클래스 HttpURLConnection 은 추가 메서드를 제공합니다.
- getResponseCode () : 서버에서 보낸 HTTP 상태 코드를 반환합니다.
헤더 필드를 읽을 때 connect() 를 호출하지 않고 암시적으로 연결이 설정 됩니다.
5. 입력 스트림 가져오기 및 데이터 읽기
실제 내용을 읽으려면 연결에서 InputStream 인스턴스를 얻은 다음 InputStream 의 read() 메서드를 사용하여 데이터를 읽어야 합니다.
1
2
삼
|
InputStream inputStream = urlCon.getInputStream();
byte[] data = new byte[1024];
inputStream.read(data);
|
InputStream 의 read() 는 데이터 를 바이트 배열로 읽는 저수준 메서드입니다. 따라서 데이터를 문자로 읽기 위해 InputStreamReader 에서 InputStream 을 래핑하는 것이 더 편리합니다 .
1
2
삼
4
5
6
|
InputStream inputStream = urlCon.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream);
int character = reader.read(); // reads a single character
char[] buffer = new char[4096];
reader.read(buffer); // reads to an array of characters
|
또는 데이터를 문자열로 읽기 위해 InputStream 을 BufferedReader 로 래핑합니다 .
1
2
|
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = reader.readLine(); // reads a line
|
getInputStream() 메서드 는 다음 예외를 throw할 수 있습니다.
- IOException : 입력 스트림을 생성하는 동안 I/O 오류가 발생한 경우.
- SocketTimeoutException : 데이터를 읽을 수 있기 전에 읽기 제한 시간이 만료되는 경우.
- UnknownServiceExcepetion : 프로토콜이 입력을 지원하지 않는 경우.
6. 출력 스트림 가져오기 및 데이터 쓰기
서버에 데이터를 보내려면 먼저 연결에서 출력을 활성화해야 합니다.
1
|
urlCon.setDoOutput(true);
|
그런 다음 연결과 연결된 OutputStream 객체를 가져온 다음 OutputStream 의 write() 메서드를 사용하여 데이터를 씁니다.
1
2
삼
|
OutputStream outputStream = urlCon.getOutputStream();
byte[] data = new byte[1024];
outputStream.write(data);
|
보시다시피 OutputStream 의 write () 는 바이트 배열을 쓰는 저수준 메서드입니다. 따라서 문자를 쓰기 위해 OutputStreamWriter 에서 OutputStream 을 래핑하는 것이 더 편리합니다 .
1
2
삼
4
5
6
|
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
int character = 'a';
writer.write(character); // writes a single character
char[] buffer = new char[4096];
writer.write(buffer); // writes an array of characters
|
또는 문자열을 작성하기 위해 PrintWriter 에서 OutputStream 을 래핑합니다 .
1
2
삼
|
PrintWriter writer = new PrintWriter(outputStream);
String line = "This is String";
writer.print(line);
|
getOutputStream() 메서드 는 IOException 또는 UnknownServiceException 을 throw할 수 있습니다 .
7. 연결 종료
연결을 닫으려면 InputStream 또는 OutputStream 객체 에서 close() 메서드를 호출 합니다. 이렇게 하면 URLConnection 인스턴스 와 연결된 네트워크 리소스가 해제될 수 있습니다 .URLConnection과 HttpURLConnection의 API를 사용하는 방법입니다. 실제 사례는 다음 문서를 확인하세요.
- Java URLConnection 및 HttpURLConnection 예제
- HttpURLConnection을 사용하여 HTTP URL에서 파일 다운로드
- GET/POST 요청을 보내는 HTTP 유틸리티 클래스
- 프로그래밍 방식으로 멀티파트 요청을 보내 파일 업로드
- URLConnection을 사용하여 FTP 서버에서 파일 다운로드
- URLConnection을 사용하여 FTP 서버의 파일 및 디렉토리 나열
- URLConnection 클래스를 사용하여 FTP 서버에 파일 업로드
글 원문 : https://www.codejava.net/java-se/networking/how-to-use-java-urlconnection-and-httpurlconnection
'기존 > 🏀Spring' 카테고리의 다른 글
(스프링)휴대폰인증 jsp 등록 인증 체크 (0) | 2022.07.06 |
---|---|
(스프링소셜로그인)카카오 로그인 API (1) | 2022.07.06 |
[Spring] 기본속성 (0) | 2022.06.09 |
[Spring] 로그인,관리자만들기 (0) | 2022.06.03 |
[Spring] 파일 업로드 (0) | 2022.06.03 |