Comment récupérer des données brutes depuis HttpServletRequest en java

j'essaie d'obtenir les données post en Java. On dirait que ça devrait être une des choses les plus simples à faire, non? Je veux dire, HttpServletRequest.getParameter doit bien le faire? Comment obtenir les données brutes?

j'ai trouvé HttpServletRequest get JSON POST data et j'ai utilisé le code de Kdeveloper pour extraire les données post d'une requête. Il fonctionne, mais il ya un hic: je ne peux obtenir que les données post une fois .

Voici la méthode que J'ai faite à partir du code de Kdeveloper:

public static String getPostData(HttpServletRequest req) {
    StringBuilder sb = new StringBuilder();
    try {
        BufferedReader reader = req.getReader();
        reader.mark(10000);

        String line;
        do {
            line = reader.readLine();
            sb.append(line).append("n");
        } while (line != null);
        reader.reset();
        // do NOT close the reader here, or you won't be able to get the post data twice
    } catch(IOException e) {
        logger.warn("getPostData couldn't.. get the post data", e);  // This has happened if the request's reader is closed    
    }

    return sb.toString();
}

auparavant, j'avais fermé le lecteur à la fin de cette méthode, mais cela a causé des exceptions lorsque la méthode a couru plus d'une fois sur la même demande. Sans la fermer, aucune exception ne se produit, mais la méthode renvoie une chaîne vide.

Honnêtement, il devrait juste y avoir un req exposé.méthode getPostData () - personne n'a pensé que cela serait utile?

alors comment puis-je écrire cette méthode de sorte qu'elle retourne toujours les données de post correctes?

54
demandé sur Community 2011-02-17 03:08:11

2 réponses

le corps de la requête est disponible par HttpServletRequest#getInputStream() et #getReader() .

InputStream body = request.getInputStream();
// ...

Notez que vous pouvez le lire qu'une seule fois. Le client ne va pas le renvoyer plusieurs fois. Appeler getParameter() et ainsi de suite le Lira implicitement aussi. Tu dois stocker le corps quelque part et te transformer.

82
répondu BalusC 2011-02-17 00:11:36

nous avons eu une situation où IE nous a forcé à poster comme texte/simple, donc nous avons dû analyser manuellement les paramètres en utilisant getReader. Le servlet était utilisé pour de longs sondages, donc quand AsyncContext:: dispatch était exécuté après un délai, il reprenait littéralement la requête les mains vides.

donc j'ai juste stocké le post dans la requête quand il est apparu pour la première fois en utilisant HttpServletRequest::setAttribute. La méthode getReader vide le tampon, où getParameter vide le tampon trop mais stocke les paramètres automatiquement.

    String input = null;

    // we have to store the string, which can only be read one time, because when the
    // servlet awakens an AsyncContext, it reposts the request and returns here empty handed
    if ((input = (String) request.getAttribute("com.xp.input")) == null) {
        StringBuilder buffer = new StringBuilder();
        BufferedReader reader = request.getReader();

        String line;
        while((line = reader.readLine()) != null){
            buffer.append(line);
        }
        // reqBytes = buffer.toString().getBytes();

        input = buffer.toString();
        request.setAttribute("com.xp.input", input);
    }

    if (input == null) {
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();
        out.print("{\"act\":\"fail\",\"msg\":\"invalid\"}");
    }       
7
répondu djabraham 2013-06-06 17:50:21