web-dev-qa-db-fra.com

Comment imprimer le contenu de la requête httprequest?

J'ai un bogue impliquant httprequest, ce qui arrive parfois, alors j'aimerais enregistrer le contenu de la requête HttpGet et HttpPost lorsque cela se produit.

Donc, disons, je crée HttpGet comme ceci:

HttpGet g = new HttpGet();
g.setURI(new URI("http://www.google.com"));
g.setHeader("test", "hell yeah");

Voici la représentation sous forme de chaîne que j'aimerais obtenir:

GET / HTTP/1.1
Host: www.google.com
test: hell yeah

Avec la demande de publication, j'aimerais également obtenir la chaîne de contenu.

Quel est le moyen le plus simple de le faire en Java pour Android?

24
Arsen Zahray

Vous pouvez imprimer le type de demande en utilisant:

request.getMethod();

Vous pouvez imprimer tous les en-têtes mentionnés ici:

Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
  String headerName = headerNames.nextElement();
  System.out.println("Header Name - " + headerName + ", Value - " + request.getHeader(headerName));
}

Pour imprimer tous les paramètres de la requête, utilisez ceci:

Enumeration<String> params = request.getParameterNames(); 
while(params.hasMoreElements()){
 String paramName = params.nextElement();
 System.out.println("Parameter Name - "+paramName+", Value - "+request.getParameter(paramName));
}

request est l'instance de HttpServletRequest

Vous pouvez embellir les sorties selon vos besoins.

64
Juned Ahsan

Plus de détails qui aident à la journalisation

    String client = request.getRemoteAddr();
    logger.info("###### requested client: {} , Session ID : {} , URI :" + request.getMethod() + ":" + request.getRequestURI() + "", client, request.getSession().getId());

    Map params = request.getParameterMap();
    Iterator i = params.keySet().iterator();
    while (i.hasNext()) {
        String key = (String) i.next();
        String value = ((String[]) params.get(key))[0];
        logger.info("###### Request Param Name : {} , Value :  {} ", key, value);
    }
1

Si vous voulez la chaîne de contenu et que cette chaîne ne comporte pas de paramètres, vous pouvez utiliser

    String line = null;
    BufferedReader reader = request.getReader();
    while ((line = reader.readLine()) != null){
        System.out.println(line);
    }
0
PbxMan

Cela devrait être plus utile pour le débogage . La réponse de @Juned Ahsan ne spécifiera pas une URL complète et n'imprimera pas plusieurs en-têtes/paramètres.

private String httpServletRequestToString(HttpServletRequest request) {
    StringBuilder sb = new StringBuilder();

    sb.append("Request Method = [" + request.getMethod() + "], ");
    sb.append("Request URL Path = [" + request.getRequestURL() + "], ");

    String headers =
        Collections.list(request.getHeaderNames()).stream()
            .map(headerName -> headerName + " : " + Collections.list(request.getHeaders(headerName)) )
            .collect(Collectors.joining(", "));

    if (headers.isEmpty()) {
        sb.append("Request headers: NONE,");
    } else {
        sb.append("Request headers: ["+headers+"],");
    }

    String parameters =
        Collections.list(request.getParameterNames()).stream()
            .map(p -> p + " : " + Arrays.asList( request.getParameterValues(p)) )
            .collect(Collectors.joining(", "));             

    if (parameters.isEmpty()) {
        sb.append("Request parameters: NONE.");
    } else {
        sb.append("Request parameters: [" + parameters + "].");
    }

    return sb.toString();
}
0
Witold Kaczurba