J'ai une bibliothèque javascript qui envoie une requête POST à mon servlet Java, mais dans la doPost
méthode, je n'arrive pas à obtenir le contenu de la charge utile de la requête. Dans Chrome Developer Tools, tout le contenu se trouve dans la section Request Payload de l'onglet Headers, et le contenu y est, et je sais que le POST est reçu par la méthode doPost, mais il est juste vide.
Pour l' HttpServletRequest
objet, comment puis-je obtenir les données dans la charge utile de la requête?
Faire request.getParameter()
ou les request.getAttributes()
deux se retrouvent sans données
Réponses:
Réponse simple:
utilisez getReader () pour lire le corps de la requête
Plus d'infos:
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 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, pas les deux."
la source
En utilisant cette méthode
la source
request.getInputStream()
cela n'honore pas le codage des caractères de la demande comme lerequest.getReader()
fait. Donc, cet exemple utilise le jeu de caractères système par défaut.new BufferedReader(new InputStreamReader(request.getInputStream()))
pourrait être simplifié à cerequest.getReader()
qui est déjà mis en mémoire tampon et préserve également le codage des demandes.javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this request
lorsque j'ai appelé getReader () car le lecteur était déjà ouvert.Vous pouvez utiliser Buffer Reader à partir de la demande de lecture
la source
Flux Java 8
la source
(accumulator, actual) -> accumulator + actual
parString::concat
.Avec Apache Commons IO, vous pouvez le faire en une seule ligne.
la source
Si le contenu du corps est une chaîne en Java 8, vous pouvez faire:
String body = request.getReader().lines().collect(Collectors.joining());
la source
Si vous êtes en mesure d'envoyer la charge utile en JSON, c'est le moyen le plus pratique de lire la charge de lecture:
Exemple de classe de données:
Exemple de charge utile (corps de la requête):
Code pour lire la charge utile dans le servlet (nécessite com.google.gson. *):
C'est tout. Nice, facile et propre. N'oubliez pas de définir l'en-tête de type de contenu sur application / json.
la source
Utilisation de Java 8 essayez avec des ressources:
la source
Tu a juste besoins
pour obtenir les paramètres POST et GET.
La méthode renvoie un
Map<String,String[]>
.Vous pouvez lire les paramètres de la carte en
la source
application/x-www-form-urlencoded
; carmultipart/form-data
, vous devez apparemment accéder à la partie du corpsrequest.getReader()
et l'analyser manuellement.