web-dev-qa-db-fra.com

Récupération de la charge de la requête à partir de POST requête dans Java servlet

J'ai une bibliothèque javascript qui envoie une demande POST à mon servlet Java, mais dans la méthode doPost, il semble impossible d'obtenir le contenu de la demande. charge utile. Dans chrome Developer Tools, tout le contenu se trouve dans la section Request Payload de l'onglet en-têtes, ainsi que le contenu, et je sais que le POST est reçu par la méthode doPost. , mais ça reste vide.

Pour l'objet HttpServletRequest, comment puis-je obtenir les données dans la charge de la demande?

Faire request.getParameter() ou request.getAttributes() tous les deux finissent sans données

95
Fasih Awan

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 devez lire des données binaires.

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

96
davidfrancis
String payloadRequest = getBody(request);

Utiliser 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;
}
61
Adrian Ayala Torres

Vous pouvez utiliser Buffer Reader à 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);
    }
    String data = buffer.toString()
48
Fizer Khan

Java 8 flux

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

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

IOUtils.toString(request.getReader())
18
Diji Adeyemo

Si le contenu du corps est une chaîne dans Java 8, vous pouvez effectuer les opérations suivantes:

String body = request.getReader().lines().collect(Collectors.joining());

7
Lloyd Rochester

Si vous êtes capable d’envoyer le contenu en JSON, c’est le moyen le plus pratique de lire le contenu:

Exemple de classe de données:

public class Person {
    String firstName;
    String lastName;
    // Getters and setters ...
}

Exemple de charge utile (corps de la demande):

{ "firstName" : "John", "lastName" : "Doe" }

Code permettant de lire la charge dans le servlet (nécessite com.google.gson. *):

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

C'est tout. Nice, facile et propre. N'oubliez pas de définir l'en-tête content-type sur application/json.

3
Harry Developer

En utilisant Java 8, essayez avec les ressources:

    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);
        }
    }
2
Timothy Heider

Tu a juste besoins

request.getParameterMap ()

pour obtenir le POST et les paramètres GET.

La méthode retourne un Map<String,String[]>.

Vous pouvez lire les paramètres dans la carte en

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);
    }
}
1
Arol