123 votes

Obtenir la charge utile d'une requête POST dans un servlet Java

J'ai une bibliothèque javascript qui envoie une demande POST à mon servlet Java, mais dans le fichier doPost mais je ne parviens pas à obtenir le contenu de la requête. Dans les outils de développement de chrome, tout le contenu se trouve dans la section Request Payload dans l'onglet headers, et le contenu est là, et je sais que le POST est reçu par la méthode doPost, mais il n'y a rien.

Pour le HttpServletRequest comment puis-je obtenir les données dans les données utiles de la requête ?

Faire request.getParameter() o request.getAttributes() les deux se retrouvent sans données

116voto

davidfrancis Points 1882

Réponse simple :
Utilisez getReader() pour lire le corps de la requête.

Plus d'informations :
Il existe deux méthodes pour lire les données dans le corps :

  1. getReader() renvoie un BufferedReader qui vous permettra de lire le corps de la requête.

  2. getInputStream() renvoie un ServletInputStream si vous avez besoin de lire des données binaires.

Note de la documentation : "[L'une ou l'autre méthode] peut être appelée pour lire le corps, mais pas les deux."

78voto

String payloadRequest = getBody(request);

En utilisant cette méthode

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;
}

58voto

Fizer Khan Points 4128

Vous pouvez utiliser Buffer Reader à partir de la demande pour lire

    // 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()

43voto

bbviana Points 11

Les flux de Java 8

String body = request.getReader().lines()
    .reduce("", (accumulator, actual) -> accumulator + actual);

32voto

Diji Adeyemo Points 441

Avec Apache Commons IO vous pouvez le faire en une seule ligne.

IOUtils.toString(request.getReader())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X