Java 如何打印httprequest请求的内容?

Java 如何打印httprequest请求的内容?,java,android,http-post,http-get,Java,Android,Http Post,Http Get,我遇到了一个涉及httprequest的bug,这种情况有时会发生,所以我希望在出现这种情况时记录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 tes

我遇到了一个涉及httprequest的bug,这种情况有时会发生,所以我希望在出现这种情况时记录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
对于post请求,我还希望获得内容字符串


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

您可以使用以下命令打印请求类型:

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 headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
字符串headerName=headerName.nextElement();
System.out.println(“头名称-”+headerName+”,值-“+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));
}
Enumeration params=request.getParameterNames();
while(params.hasMoreElements()){
字符串paramName=params.nextElement();
System.out.println(“参数名-”+paramName+”,值-“+request.getParameter(paramName));
}
request
HttpServletRequest


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

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

String client=request.getRemoteAddr();
logger.info(“##########请求的客户端:{},会话ID:{},URI:“+request.getMethod()+”:“+request.getRequestURI()+”,客户端,request.getSession().getId());
Map params=request.getParameterMap();
迭代器i=params.keySet().Iterator();
while(i.hasNext()){
字符串键=(字符串)i.next();
字符串值=((字符串[])params.get(键))[0];
logger.info(“请求参数名:{},值:{}”,键,值);
}

如果您想要内容字符串,而该字符串没有参数,则可以使用

字符串行=null;
BufferedReader reader=request.getReader();
而((line=reader.readLine())!=null){
系统输出打印项次(行);
}

这对调试应该更有帮助。 来自@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();
}

以防有人也想像我一样拒绝回应。我避免抛尸。下面的代码只是转储状态代码和标题

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

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

公共静态字符串打印请求(HttpServletRequest请求){
字符串参数=StreamSupport.stream(
((Iterable)(->req.getParameterNames().asIterator()).spliterator(),false)
.map(pName->pName+'='+req.getParameter(pName))
.collect(收集器.连接(&));
返回req.getRequestURI()+'?'+参数;
}

另请参见解决方案。

提示:还应指定
枚举的类型(例如
枚举
),以避免不必要的IDE错误并正确使用泛型。添加
枚举
也会使字符串的强制转换变得不必要。或者可以指定枚举以避免
hasMoreElements()
nextElement())
作为单独的语句,
枚举
可以转换为
列表
(字符串headerName:Collections.List(request.getHeaderNames())
注意,
asIterator()
是Java 9+的补充。@tom_mai78101 Coll请详细解释您的建议。
asIterator()
req.getParameterNames().asIterator()中的
是Java 9中添加和支持的方法。任何使用Java8的人都不能使用此方法。
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;
}