HttpRequestBase - как распечатать запрос со всеми его данными
Я использую HttpRequestBase, и я хочу полностью зарегистрировать запрос до файла журнала перед его использованием.
По умолчанию toString возвращает только строку запроса, и я хочу напечатать все заголовки, параметры, тело запроса и т.д.
Есть ли способ сделать это?
Ответы
Ответ 1
Объект HttpRequestBase
(HttpGet
, HttpPost
и т.д.) содержит информацию об заголовках, параметрах, а класс реализации содержит тело, но он фактически не сериализуется в String
. Это происходит, когда HttpClient
отправляет запрос.
Вы можете играть с http-компонентами конфигурацией ведения журнала.
Или вы можете вызвать соответствующие методы и сделать это самостоятельно.
HttpRequestBase base = new HttpGet("www.google.com");
Header[] headers = base.getAllHeaders();
// iterate and print
Для тела вам нужно применить класс реализации и получить HttpEntity
, если он есть.
HttpEntity entity = ((HttpPost)base).getEntity(); // example
И напечатайте его (содержимое InputStream
). Примечание. Это может уничтожить объект.
Полный пример
HttpPost post = new HttpPost("www.google.com");
post.setHeader(new BasicHeader("User-Agent", "random client"));
HttpEntity entity = new StringEntity("yellaworld");
post.setEntity(entity);
Header[] headers = post.getAllHeaders();
String content = EntityUtils.toString(entity);
System.out.println(post.toString());
for (Header header : headers) {
System.out.println(header.getName() + ": " + header.getValue());
}
System.out.println();
System.out.println(content);
печатает
POST www.google.com HTTP/1.1
User-Agent: random client
yellaworld
Ответ 2
Это работает
private void printRequest() {
System.out.println("receive " + httpRequest.getMethod() +" notification for "+ httpRequest.getRequestURI());
System.out.println(" \n\n Headers");
Enumeration headerNames = httpRequest.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
System.out.println(headerName + " = " + httpRequest.getHeader(headerName));
}
System.out.println("\n\nParameters");
Enumeration params = httpRequest.getParameterNames();
while(params.hasMoreElements()){
String paramName = (String)params.nextElement();
System.out.println(paramName + " = " + httpRequest.getParameter(paramName));
}
System.out.println("\n\n Row data");
System.out.println(extractPostRequestBody(httpRequest));
}
static String extractPostRequestBody(HttpServletRequest request) {
if ("POST".equalsIgnoreCase(request.getMethod())) {
Scanner s = null;
try {
s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A");
} catch (IOException e) {
e.printStackTrace();
}
return s.hasNext() ? s.next() : "";
}
return "";
}