상세 컨텐츠

본문 제목

(HttpURLConnection) 안드로이드 HTTP 통신하기 02 ( HttpURLConnection란? )

Android

by choiDev 2019. 1. 22. 22:25

본문

HttpURLConnection란?

 - HTTP 통신을 위한 URL 연결을 할 수 있다.

 - MIME형식에 맞는 데이터를 GET 방식이나 POST 방식으로 보내거나 요청할 수 있다. 

 - 데이터의 타입이나 길이는 거의 제한이 없다.

 - HttpURLConnection는 protected로 선언되어 있기 때문에 기본적으로 개발자가 생성할 수 없다. 그래서 URL 객체의 openConnection()메서드를 통해 획득한다.

- HttpURLConnection은 기본적으로 GET메서드를 사용한다.

   setRequestMethod() 메서드를 사용해서 기능 변경 가능


ex) URL url = new URL("http://www.naver.com");

      HttpURLConnection http = (HttpURLConnection) u.openConnection();



setRequestMethod() 메소

 요청 메소드 종류

  - HEAD : 문서의 헤더 정보만 요청한다.

  - GET : 웹 서버로부터 리소스를 가져온다.

  - POST : 폼에 입력된 내용을 서버로 전송한다.

  - DELETE : 웹 서버의 리소스를 지운다. 대부분의 서버는 기본적으로 DELETE를 허용하지 않거나 인증을 요구한다. 서버는 이 요청을 거절하거나 인증을 요청할 수 있으며, 허용하는 경우에도 응답을 구현에 따라 차이가 있다. 서버 설정에 따라 파일을 지우기, 휴지통으로 이동, 파일을 읽을 수 없도록 표시하는 등의 행위를 하게 된다.

  - PUT : 웹 서버로 리소스를 전송한다. PUT 요청도 파일을 지울 때와 마찬가지로 보통 사용자 인증을 요구하며, PUT 메서드를 지원하도록 설정해줘야 한다.

  - OPTIONS : 특정 URL에 대해 지원되는 요청 메서드의 목록을 리턴한다. 요청 URL이 *인 경우 해당 요청의 대상은 서버에 있는 하나의 특정 URL이 아니라 서버 전체에 적용된다는 것을 의미한다.

  - TRACE : 요청을 추적하며 클라이언트가 보낸 요청이 클라이언트와 서버 사이에 있는 프록시 서버에서 변경되었는지를 확인할 필요가 있는 경우 등에 쓰임


getResponseCode() 메소드

 - 응답 코드와 응답 메시지를 리턴 받을 수 있다.


ex) 예제 코드

URL url = new URL("www.naver.com");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
Log.d("LOG", "응답코드 : " + con.getResponseCode());
Log.d("LOG", "응답메세지 : " + con.getResponseMessage());
"결과 (요청 성공 시) 응답코드 : 200 , 응답메세지 : OK"


스트리밍

 - HTTP 서버로 전송되는 모든 요청에는 HTTP 헤더가 포함된다.

 - 헤더는 요청 본문보다 먼저 전송되기 때문에 헤더를 작성하기 위해 요청 본문의 길이를 먼저 알아야 하는 경우 문제가 발생한다. 자바는 이 상황을 HttpURLConnection에서 얻은 OutputStream에 쓴 모든 데이터를 스트림이 닫힐 때까지 캐시하는 방법으로 해결한다. 즉 스트림이 닫히는 시점에 요청 본문의 크기를 계산해서 이 정보로 Content-length 헤더를 작성하는 것이다 하지만 이렇게 길이를 구해도 본문이 엄청 큰 경우 정상 동작 하지 않거나 매우 느린 경험을 할 수 있다.

   

   해결책은 다음과 같다

1. 전송할 데이터의 크기를 모르는 경우

 - 전송할 데이터의 크기를 알 수 없는 경우 (청크 분할 전송 인코딩 모드)를 사용할 수 있다.

 - 이 방법을 사용하려면 URL을 연결하기 전에 setChunkedStreamingMode() 메소드를 호출하면서 

    원하는 청크의 크기를 파라미터로 전달해야 한다.

 

2. 데이터의 크기를 아는 경우

  - 요청 데이터의 크기를 미리 알 수 있는 경우에는 이 정보를 HttpURLConnection 객체에 전달해서 연결을 최적화 할 수 있다.

  - 데이터의 크기를 미리 전달할 경우에 해당 데이터를 네트워크로 즉시 스트리밍 할 수 있기 때문이다.

  - 전송할 데이터의 크기를 인자로 setFixedLengthStreamingMode() 메소드를 호출하면 된다.

  

관련글 더보기