ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HttpURLConnection을 이용한 Http 클라이언트
    프로그래밍/자바 2020. 2. 22. 14:29

      사용자는 웹브라우저(익스플로러, 크롬, 사파리 등등)를 통해 웹서버에게 필요 URI를 요청하고 응답 값을 받는다. 웹브라우저는 그 응답 값(보통 HTML)을 해석하여 화면을 만들어준다. 이 처럼 웹서버에게 웹서비스를 제공받으려면 웹 클라이언트가 필요하다. 이 웹 클라이언트 부분을 자바에서 구현하려면 어떻게 해야 할까?

     

      자바에서는 URLConnection이라는 추상화 클래스를 제공해준다.
      HttpURLConnection의 계층구조를 보면 아래와 같다.

     

    URLConnection 계층구조

      이 중에서 HttpURLConnection을 이용하여 웹 클라이언트를 설명해보겠다.

     

      – 예제 코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
     
    public class TestCode {
         
        public void naverInvoker(){
            try {
     
                URL url = new URL("http://naver.com");
     
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
     
                InputStream is = connection.getInputStream();
     
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String readLine = null;
     
                while ((readLine = br.readLine()) != null) {
                    System.out.println(readLine);
                }
     
                br.close();
     
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
         
        public static void main(String[] args) {
             
            TestCode t = new TestCode();
            t.naverInvoker();
        }
    }

    16 line : url 객체의 openConnection() 메서드를 통해 URLConnection을 얻어온다.
    18 line : 얻은 connection 객체에 request method를 ‘GET’으로 설정한다.
    19 line : 응답 값을 읽어오기 위해 inputstream 사용 여부에 대해 true로 설정한다.
    26-28 line : 응답값을 콘솔로 출력한다.


      – wireshark로 캡처한 패킷

     

      네이버 서버에 연결 후 위의 패킷을 전송하면 아래와 같은 응답 값을 준다.

     

      – 콘솔로 출력된 응답 값

     

      웹브라우저가 해당 응답 값을 받았다면 html을 해석하여 화면에 출력했을 것이다.

      위의 예제는 GET 메서드를 사용하였다. POST 메서드를 사용한다면 클라이언트도 서버에게 보내줄 body 부분이 필요할 것이다. connection.setDoOutput(true)로 설정하고 connection객체의 outputstream을 반환하여 write를 해준다면 올바른 요청이 가능하다.

     

      위와 같은 예제를 응용하면 주기적으로 특정 웹페이지를 수집할 수 있는 수집기 로봇을 구현할 수도 있을 것이다.

    댓글 0

Designed by Tistory.