web-dev-qa-db-ja.com

HttpRequestBase-すべてのデータとともにリクエストを印刷する方法

HttpRequestBaseを使用していますが、使用する前に完全にログファイルにリクエストを記録したいと思います。

デフォルトのtoStringはリクエスト行のみを返し、すべてのヘッダー、パラメーター、リクエスト本文などを印刷したい...

そうする方法はありますか?

16
SharonBL

HttpRequestBaseオブジェクト(HttpGetHttpPostなど)にはヘッダー、パラメーターに関する情報が含まれ、実装クラスには本体が含まれますが、実際にはStringにシリアル化されていません。これは、HttpClientが実際にリクエストを送信したときに発生します。

Httpコンポーネント logging configuration で遊ぶことができます。

または、適切なメソッドを呼び出して自分で行うこともできます。

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
16

これは機能します

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 "";
        }
2
Bruno Lee