Java 서블릿의 POST 요청에서 요청 페이로드 가져오기
자바 서블릿에 POST 요청을 보내는 Javascript 라이브러리가 있지만doPost
메서드, 요청 페이로드의 내용을 가져올 수 없습니다.Chrome Developer Tools에서는 모든 콘텐츠가 헤더 탭의 Request Payload 섹션에 있으며, 컨텐츠는 거기에 있습니다.또한 POST가 doPost 메서드로 수신되고 있는 것은 알고 있습니다만, 아무것도 표시되지 않습니다.
를 위해HttpServletRequest
오브젝트, 요청 페이로드의 데이터를 얻을 수 있는 방법은 무엇입니까?
하고있다request.getParameter()
또는request.getAttributes()
둘 다 데이터가 없다
간단한 답변:
getReader()를 사용하여 요청 본문을 읽습니다.
상세 정보:
본문의 데이터를 읽는 방법에는 다음 두 가지가 있습니다.
getReader()
요청 본문을 읽을 수 있는 BufferedReader를 반환합니다.getInputStream()
이진 데이터를 읽어야 할 경우 ServletInputStream을 반환합니다.
문서 메모: "[둘 다 아닌 두 가지 방법] 중 하나를 호출하여 본문을 읽을 수 있습니다.
String payloadRequest = getBody(request);
이 방법을 사용하여
public static String getBody(HttpServletRequest request) throws IOException {
String body = null;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
return body;
}
요청에서 읽기까지 버퍼 판독기를 사용할 수 있습니다.
// Read from request
StringBuilder buffer = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
buffer.append(System.lineSeparator());
}
String data = buffer.toString()
Java 8 스트림
String body = request.getReader().lines()
.reduce("", (accumulator, actual) -> accumulator + actual);
Apache Commons IO를 사용하면 이 작업을 한 줄로 수행할 수 있습니다.
IOUtils.toString(request.getReader())
본문의 내용이 Java 8의 문자열인 경우 다음을 수행할 수 있습니다.
String body = request.getReader().lines().collect(Collectors.joining());
페이로드를 JSON으로 송신할 수 있는 경우는, 플레이 로드를 읽어내는 가장 편리한 방법이 다음과 같습니다.
데이터 클래스의 예:
public class Person {
String firstName;
String lastName;
// Getters and setters ...
}
페이로드 예(요구 본문):
{ "firstName" : "John", "lastName" : "Doe" }
payload를 servlet으로 읽는 코드(com.google.gson 필요).*):
Person person = new Gson().fromJson(request.getReader(), Person.class);
그게 다예요.멋지고, 쉽고, 깨끗해.content-type 헤더를 application/json으로 설정하는 것을 잊지 마십시오.
Java 8을 사용하여 리소스를 사용해 보십시오.
StringBuilder stringBuilder = new StringBuilder();
try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()))) {
char[] charBuffer = new char[1024];
int bytesRead;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
}
필요한 것은
request.getParameterMap()
POST 및 GET - 매개 변수를 가져옵니다.
메서드는 a를 반환합니다.Map<String,String[]>
.
지도의 매개변수를 읽을 수 있습니다.
Map<String, String[]> map = request.getParameterMap();
//Reading the Map
//Works for GET && POST Method
for(String paramName:map.keySet()) {
String[] paramValues = map.get(paramName);
//Get Values of Param Name
for(String valueOfParam:paramValues) {
//Output the Values
System.out.println("Value of Param with Name "+paramName+": "+valueOfParam);
}
}
언급URL : https://stackoverflow.com/questions/14525982/getting-request-payload-from-post-request-in-java-servlet
'programing' 카테고리의 다른 글
vue-material: 알 수 없는 커스텀 컴포넌트 md-md-content (0) | 2022.12.26 |
---|---|
설치된 모듈을 가져올 수 없습니다. (0) | 2022.12.26 |
팬더에서 플로트를 ints로 변환? (0) | 2022.12.26 |
vuejs2에서 "사용자 입력 중지 후 양식 제출"을 수행하는 방법 (0) | 2022.12.26 |
html 폼태그의 목적은 무엇입니까? (0) | 2022.12.26 |