시냅스

Java 소켓으로 HTTP 요청 구현하기 본문

Java, Spring

Java 소켓으로 HTTP 요청 구현하기

ted k 2023. 4. 16. 20:10

 

 

Java에서 HTTP 요청을 보내는데 사용되는 대표적인 라이브러리로는 RestTemplate, HttpClient 등이 있습니다.

이 글에서는 이러한 라이브러리를 사용하지 않고 Java의 기본 소켓을 이용하여 직접 HTTP 요청을 구현해보겠습니다.

(HTTP 는 그냥 String 덩어리입니다!)

 

아래에서 코드로 살펴보겠습니다.

 

GET 요청

public static void simpleGetRequest() {
    try {
        Socket socket = new Socket(host, port);

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        // 아래 2줄은 필수값
        out.println("GET " + path + " HTTP/1.1"); // method, path, http spec
        out.println("Host: " + host); // 요청 도메인
        out.println("Connection: close");
        out.println();

        String responseLine;
        while ((responseLine = in.readLine()) != null) {
            System.out.println(responseLine);
        }

        in.close();
        out.close();
        socket.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

HTTP GET 요청을 보내는 메소드입니다.

  • Socket 객체를 생성하고 HTTP 요청 spec 에 맞춰 method, path, http spec, 요청 도메인 등을 write 합니다.
  • 이후 response 를 socket 의 inputstream 을 통해 읽습니다.
  • 정말 간단히 "/" path 에 GET 요청을 보내기만 하므로 딱히 해야할 처리가 없습니다.

 

POST 요청

    public static void simplePostRequest() {
        try {
            String data = URLEncoder.encode("key1", "UTF-8")
                    + "=" + URLEncoder.encode("value1", "UTF-8");

            Socket socket = new Socket(host, port);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out.println("POST " + path + " HTTP/1.1");
            out.println("Host: " + host);
            out.println("Content-Type: application/x-www-form-urlencoded");
            out.println("Content-Length: " + data.length());
            out.println("Connection: close");
            out.println(); // Http Format 을 위해 공백 추가
            out.print(data); // write
            out.flush(); // flush

            String responseLine;
            while ((responseLine = in.readLine()) != null) {
                System.out.println(responseLine);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

HTTP POST 요청을 보내는 메소드입니다.

  • 이번에는 form data 를 보냅니다.
  • 이를 위해 encoding 된 form data 와 socket 을 생성합니다.
  • 위의 GET 요청과 비슷하게 HTTP 요청 spec 들을 작성합니다.
  • 다만 이 때에는 보낼 데이터에 대한 정보들을 표기합니다.
    • Content-Type
      • Http Body 의 media type 을 의미합니다. 즉, 데이터가 어떤 형식인지 표기하여 서버가 처리할 수 있게 합니다.
    • Content-length
      • Http Body 의 크기를 바이트로 나타냅니다. 
    • 실제로 보낼 data
  • 이후 response 를 읽는 것 또한 GET 요청과 동일합니다.

 

Java Socket 을 사용하여 HTTP GET 요청과 POST 요청을 간단히 알아보았습니다.

추가로 구현할 수 있는 것들(query parameter, JSON, MultipartFile 등) 이 있지만 

Url에 어떻게 붙일지, Text 직렬화를 할지, Binary 직렬화를 할지에 대한 내용으로 구현이 어렵지 않겠습니다.

이번에는 간단한 요청을 구현함으로 HTTP 의 기본적인 원리에 대해 이해해보았습니다.

 

직렬화에 대한 내용은 아래에 설명된 글을 참고해주세요.

 

https://liltdevs.tistory.com/171

 

Java 코드로 알아보는 직렬화와 역직렬화

자바 직렬화 (Java Serialization) 자바 객체를 바이트 스트림으로 변환하여 파일이나 네트워크 상에서 전송 가능하도록 만드는 것 자바 객체는 주소 값을 가지고 있고 이는 프로세스가 새로 실행될

liltdevs.tistory.com

 

끝!

Comments