Normalement, vous pouvez obtenir des paramètres GET et POST dans une servlet de la même manière :
request.getParameter("cmd");
Mais seulement si les données POST sont encodé en tant que paires clé-valeur du type de contenu : "application/x-www-form-urlencoded" comme lorsque vous utilisez un formulaire HTML standard.
Si vous utilisez un schéma d'encodage différent pour vos données d'affichage, comme dans votre cas lorsque vous publiez une flux de données json vous devez utiliser un décodeur personnalisé capable de traiter le flux de données brutes :
BufferedReader reader = request.getReader();
Exemple de post-traitement Json (utilise org.json paquet )
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
StringBuffer jb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
} catch (Exception e) { /*report an error*/ }
try {
JSONObject jsonObject = HTTP.toJSONObject(jb.toString());
} catch (JSONException e) {
// crash and burn
throw new IOException("Error parsing JSON request string");
}
// Work with the data using methods like...
// int someInt = jsonObject.getInt("intParamName");
// String someString = jsonObject.getString("stringParamName");
// JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName");
// JSONArray arr = jsonObject.getJSONArray("arrayParamName");
// etc...
}
7 votes
C'est une méthode simple pour obtenir les données de la requête
request.getReader().lines().collect(Collectors.joining())
2 votes
L'élément mentionné ci-dessus lance une exception de flux déjà fermé
0 votes
Si vous utilisez le
getReader()
le flux sera fermé, car à l'origine il ne peut être lu qu'une seule fois. Il existe un certain nombre d'alternatives sur les implémentations de Wrapper pour permettre des appels multiples àgetReader()
0 votes
La manière la plus simple de résoudre ce problème est d'utiliser Jackson 's
ObjectMapper
. Sa méthode surchargéereadValue
a une variante qui accepte unReader
et unClass<T>
. Ce que vous obtenez est :new ObjectMapper().readValue(request.getReader(), YourBodyType.class)
- et voilà. Court et lisse.