166 votes

HttpServletRequest obtient les données JSON POST

J'envoie un HTTP POST à l'URL http://laptop:8080/apollo/services/rpc?cmd=execute.

avec données POST

{ "jsondata" : "data" }

La requête Http a un Content-Type de application/json; charset=UTF-8

Comment récupérer les données POST (jsondata) de HttpServletRequest ?

Si j'énumère les paramètres de la demande, je ne vois qu'un seul paramètre, qui est "cmd", pas les données POST.

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

282voto

Kdeveloper Points 7034

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

4 votes

Il semble que vous ne pouvez obtenir les données du message qu'à partir de request.getReader. une fois . Est-ce que c'est vrai ? Lorsque j'ai essayé moi-même, les appels ultérieurs pour obtenir les post-données de la demande ont échoué.

12 votes

C'est exact, vous ne pouvez lire le contenu du corps de la requête qu'une seule fois.

0 votes

Cela m'a vraiment sauvé la mise... mais qu'est-ce que getReader et comment les données json sont-elles alimentées ? est-ce spécifiquement pour JSON ? ou tout autre objet ? tout lien utile s'il vous plaît.

7voto

Buhake Sindi Points 38654

Tout d'abord, vous devez définir un paramètre dans HTTP Post, par exemple (disons que le mien est "jsonValue" ) et le lier à la valeur de l'objet JSON (sous forme de chaîne).

et sur HttpServletRequest (en doPost ), faites ce qui suit :

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String jsonValue = request.getParameter("jsonValue");

    if (jsonValue != null && !jsonValue.isEmpty()) {
        JSONObject object = new JSONObject(jsonValue);

        //do whatever you need to do with JSON....

    }
}

-3voto

CharlesLeaf Points 2572

Est-ce que vous postez à partir d'une source différente (donc un port différent, ou un nom d'hôte différent) ? Si c'est le cas, ce sujet très très récent auquel je viens de répondre pourrait vous aider.

Le problème était le XHR Cross Domain Policy, et un conseil utile sur la façon de le contourner en utilisant une technique appelée JSONP. L'inconvénient majeur est que JSONP ne prend pas en charge les requêtes POST.

Je sais que dans le message original, il n'est pas fait mention de JavaScript, mais JSON est généralement utilisé pour JavaScript, c'est pourquoi j'ai tiré cette conclusion.

-10voto

YumYumYum Points 2882

Expéditeur (encodage php json) :

{"natip":"127.0.0.1","natport":"4446"}

Récepteur (décodeur java json) :

/**
 * @comment:  I moved  all over and could not find a simple/simplicity java json
 *            finally got this one working with simple working model.
 * @download: http://json-simple.googlecode.com/files/json_simple-1.1.jar
 */

JSONObject obj = (JSONObject) JSONValue.parse(line); //line = {"natip":"127.0.0.1","natport":"4446"}
System.out.println( obj.get("natport") + " " + obj.get("natip") );     // show me the ip and port please      

J'espère que cela aidera les développeurs web et les chercheurs JSON à l'esprit simple.

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