[java] Java 서블릿의 POST 요청에서 요청 페이로드 가져 오기

Java 서블릿에 POST 요청을 보내는 javascript 라이브러리가 있지만 doPost메서드에서 요청 페이로드의 내용을 가져올 수없는 것 같습니다. 크롬 개발자 도구에서 모든 콘텐츠는 헤더 탭의 Request Payload 섹션에 있으며 콘텐츠는 거기에 있으며 POST가 doPost 메서드에 의해 수신되고 있음을 알고 있지만 공백으로 표시됩니다.

를 들어 HttpServletRequest
개체, 어떤 방법으로하는 것은 내가 요청 페이로드 데이터를 얻을 수 있습니까?

데이터가 request.getParameter()없거나 request.getAttributes()둘 다 수행



답변

간단한 대답 :
getReader ()를 사용하여 요청 본문을 읽습니다.

추가 정보 :
본문의 데이터를 읽는 방법에는 두 가지가 있습니다.

  1. getReader()요청 본문을 읽을 수 있는 BufferedReader 를 반환합니다 .

  2. getInputStream()바이너리 데이터를 읽어야 하는 경우 ServletInputStream을 반환합니다 .

문서에서 참고 : “[Either method]는 본문을 읽기 위해 호출 될 수 있습니다. 둘 다가 아닙니다.”


답변

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);
    }
    String data = buffer.toString()


답변

자바 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" }

서블릿에서 페이로드를 읽는 코드 (com.google.gson. * 필요) :

Person person = new Gson().fromJson(request.getReader(), Person.class);

그게 다야. 좋고 쉽고 깨끗합니다. content-type 헤더를 application / json으로 설정하는 것을 잊지 마십시오.