application/json 형식으로 받은 데이터는 request.getParameter()로는 처리할 수 없고,
대신 request.getInputStream()을 사용하여 HTTP 본문(body)에서 데이터를 읽고 파싱해야 합니다.
application/json 데이터 처리 흐름
1. request.getInputStream()을 사용하여 HTTP 요청 본문(body)에서 JSON 데이터를 읽어옵니다.
2. 읽어온 JSON 데이터를 문자열로 변환합니다.
3. 문자열을 JSON 객체로 파싱하여 원하는 값을 추출합니다.
1. request.getInputStream()으로 application/json 데이터 읽기
application/json 데이터는 HTTP 요청 본문에 포함되어 있기 때문에, getInputStream()을 통해 이를 읽어야 합니다.
x-www-form-urlencoded는 key1=value1&key2=value2&key3=value3 이런 데이터로 구성되어있고
application/json은 { "key1": "value1", "key2": "value2", "key3": "value3" } 이렇게 구성되어있음.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.json.JSONObject;
public class MyServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
// InputStream을 통해 JSON 데이터를 읽어오기
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
StringBuilder jsonBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
jsonBuilder.append(line);
}
// JSON 문자열로 변환
String jsonString = jsonBuilder.toString();
// JSON 문자열을 JSONObject로 변환
JSONObject jsonObject = new JSONObject(jsonString);
// JSON 객체에서 "USER_ID" 값을 추출
String userId = jsonObject.getString("USER_ID");
// 출력
System.out.println("USER_ID: " + userId); // 예: "12345"
// 응답을 반환하는 코드 추가 가능
response.getWriter().write("Received USER_ID: " + userId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. HttpServletRequest에서 JSON 데이터 읽기 :
request.getInputStream():
클라이언트가 보낸 JSON 데이터는 HTTP 요청 본문에 포함됩니다. 이 데이터를 바이트 스트림으로 읽을 수 있습니다.
BufferedReader:
BufferedReader를 사용하여 문자 스트림으로 변환하고, 한 줄씩 읽어
JSON 문자열을 모은 후 전체 JSON을 하나의 문자열로 만듭니다.
JSONObject:
org.json.JSONObject를 사용하여 문자열을 JSON 객체로 변환합니다.
그 후, getString("USER_ID")와 같은 방식으로 데이터를 추출할 수 있습니다.
3. 실제 요청 예시
클라이언트가 Postman 또는 다른 HTTP 클라이언트를 사용하여 POST 요청을 보내는 경우:
Postman 설정:
- URL : https://naver.com/API/hello.do
- Method: POST
- Headers : Content-Type: application/json
- Body (raw): json
{
"USER_ID": "12345"
}
서버에서 받는 데이터:
위와 같은 JSON 데이터가 요청 본문에 담겨 서버로 전송됩니다.
JSON 데이터가 아닌 다른 형식의 데이터를 받았을 때
만약 application/x-www-form-urlencoded 형식으로 데이터를 받았다면,
그 데이터를 request.getParameter("USER_ID")로 받아올 수 있습니다.
하지만, application/json 형식은 이와 다르기 때문에 getParameter()는 사용할 수 없고, getInputStream()을 사용해야 합니다.
결론:
application/json 형식으로 데이터가 전송되었을 때, request.getParameter()로는 데이터를 처리할 수 없습니다.
대신, request.getInputStream()을 사용하여 HTTP 요청 본문에서 JSON 문자열을 읽고, 이를 JSONObject로 파싱하여 원하는 값을 추출할 수 있습니다.
이 방식으로 JSON 데이터를 Postman을 통해 서버로 보내고, Java에서 이를 JSONObject로 처리할 수 있습니다.
'Spring' 카테고리의 다른 글
@RequestMapping 호출 했는데 406 에러 뜰 때 (0) | 2025.06.14 |
---|---|
문자열을 JSONObject로 변환 (Java 1.7) (0) | 2025.06.14 |
Bean named '***Service' must be of type [****.****.****.****.service.impl.****ServiceImpl], but was actually of type [com.sun.proxy.$Proxy99] (0) | 2025.03.13 |
Spring 디버깅 하는 법 (0) | 2023.04.05 |
Spring Eclipse 파일 위치 (0) | 2023.03.30 |