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
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:
getReader()
renvoie un BufferedReader qui vous permettra de lire le corps de la requête.
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."
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;
}
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()
Java 8 flux
String body = request.getReader().lines()
.reduce("", (accumulator, actual) -> accumulator + actual);
Avec Apache Commons IO , vous pouvez le faire en une seule ligne.
IOUtils.toString(request.getReader())
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());
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.
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);
}
}
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);
}
}