43

我有一个涉及 httprequest 的错误,有时会发生,所以我想在发生这种情况时记录 HttpGet 和 HttpPost 请求的内容。

所以,比方说,我像这样创建 HttpGet:

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

这是我想得到的字符串表示:

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

通过发布请求,我还想获取内容字符串。

在java for android中最简单的方法是什么?

4

6 回答 6

96

您可以使用以下方式打印请求类型:

request.getMethod();

您可以打印此处提到的所有标题:

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

要打印所有请求参数,请使用:

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

request是的实例HttpServletRequest

您可以根据需要美化输出。

于 2013-09-22T13:26:27.597 回答
7

这应该对调试更有帮助。@Juned Ahsan 的回答不会指定完整的 URL,也不会打印多个标题/参数。

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();
}
于 2018-08-13T11:53:39.267 回答
1

万一有人也想像我一样转储响应。我避免转储响应正文。以下代码只是转储 StatusCode 和 Headers。

static private String dumpResponse(HttpServletResponse resp){
    StringBuilder sb = new StringBuilder();

    sb.append("Response Status = [" + resp.getStatus() + "], ");
    String headers = resp.getHeaderNames().stream()
                    .map(headerName -> headerName + " : " + resp.getHeaders(headerName) )
                    .collect(Collectors.joining(", "));

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

    return sb.toString();
}
于 2019-04-24T09:44:09.800 回答
1

在一行中通过流重写@Juned Ahsan 解决方案(标题的处理方式相同):

public static String printRequest(HttpServletRequest req) {
    String params = StreamSupport.stream(
            ((Iterable<String>) () -> req.getParameterNames().asIterator()).spliterator(), false)
            .map(pName -> pName + '=' + req.getParameter(pName))
            .collect(Collectors.joining("&"));
    return req.getRequestURI() + '?' + params;
}

另请参阅如何将迭代器转换为流解决方案。

于 2019-09-17T10:49:39.610 回答
0

有助于记录的更多详细信息

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);
}
于 2018-05-15T17:00:12.463 回答
0

如果您想要内容字符串并且此字符串没有参数,您可以使用

String line = null;
BufferedReader reader = request.getReader();

while ((line = reader.readLine()) != null){
    System.out.println(line);
}
于 2018-07-17T10:55:16.630 回答