일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Spring
- C
- 백준
- mongoDB
- Kafka
- IT
- Algorithm
- MySQL
- Heap
- 디자인 패턴
- 자료구조
- Java
- 컴퓨터구조
- JavaScript
- react
- 운영체제
- Proxy
- Data Structure
- 알고리즘
- spring webflux
- 파이썬
- Galera Cluster
- JPA
- redis
- MSA
- 네트워크
- c언어
- OS
- 자바
- design pattern
Archives
- Today
- Total
시냅스
Java 소켓으로 HTTP 요청 구현하기 본문
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
- Content-Type
- 이후 response 를 읽는 것 또한 GET 요청과 동일합니다.
Java Socket 을 사용하여 HTTP GET 요청과 POST 요청을 간단히 알아보았습니다.
추가로 구현할 수 있는 것들(query parameter, JSON, MultipartFile 등) 이 있지만
Url에 어떻게 붙일지, Text 직렬화를 할지, Binary 직렬화를 할지에 대한 내용으로 구현이 어렵지 않겠습니다.
이번에는 간단한 요청을 구현함으로 HTTP 의 기본적인 원리에 대해 이해해보았습니다.
직렬화에 대한 내용은 아래에 설명된 글을 참고해주세요.
https://liltdevs.tistory.com/171
끝!
'Java, Spring' 카테고리의 다른 글
HikariCP 설정과 유의사항 (0) | 2023.05.03 |
---|---|
구현하며 이해하는 Spring MVC (0) | 2023.04.16 |
Java NIO 의 작동 원리 (0) | 2023.04.04 |
코드로 살펴보는 Spring Thread Model 과 blocking/non-blocking I/O (0) | 2023.04.02 |
HikariCP 101 : 코드로 알아보는 HikariCP (0) | 2023.04.01 |
Comments