Java URLConnection 및 HttpURLConnection 사용 방법

URLConnection 및 HttpURLConnection 클래스

URLConnection 은 Java 애플리케이션과 URL 간의 연결을 나타내는 모든 클래스의 수퍼클래스입니다. URLConnection 클래스 는 일반 URL에 대한 API를 제공하고 하위 클래스인 HttpURLConnection 은 HTTP 관련 기능에 대한 추가 지원을 제공합니다.이 두 클래스는 모두 추상적입니다. 즉, URLConnection  HttpURLConnection 의 새 인스턴스를 직접 만들 수 없습니다 . 대신 URL 개체에서 연결을 열어 URLConnection 의 인스턴스를 얻습니다.일반적으로 클라이언트 프로그램은 URL을 통해 서버와 통신하는 다음 단계를 따릅니다.

  1. URL 개체 만들기
  2. URL에서 URLConnection 객체 얻기
  3. URLConnection 구성
  4. 헤더 필드 읽기
  5. 입력 스트림 가져오기 및 데이터 읽기
  6. 출력 스트림 가져오기 및 데이터 쓰기
  7. 연결 닫기

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를 사용하는 방법입니다. 실제 사례는 다음 문서를 확인하세요.

 

 

글 원문 : https://www.codejava.net/java-se/networking/how-to-use-java-urlconnection-and-httpurlconnection 

 

How to use Java URLConnection and HttpURLConnection

 

www.codejava.net