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?
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.
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);
}
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);
}
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();
}