使用过滤器和操作在play框架中获取请求主体。(在Java中)

时间:2019-06-20 03:19:43

标签: java playframework

在play框架java中找不到传入请求的请求主体。 我需要在play框架api中记录所有传入请求。为此,我尝试使用过滤器和动作组合。但我能够获得请求正文。

我尝试使用过滤器和动作合成。

public class LoggingFilter extends EssentialFilter {

    private final Executor executor;

    @Inject
    public LoggingFilter(Executor executor) {
        super();
        this.executor = executor;
    }

    @Override
    public EssentialAction apply(EssentialAction next) {
        return EssentialAction.of(request -> {
            long startTime = System.currentTimeMillis();

            Accumulator<ByteString, Result> accumulator = next.apply(request);

            System.out.println(request);
            return accumulator.map(result -> {
                long endTime = System.currentTimeMillis();
                long requestTime = endTime - startTime;


                Logger.info("{} {} took {}ms and returned {}",
                        request.method(), request.uri(), requestTime, result.status());

                return result.withHeader("Request-Time", "" + requestTime);
            }, executor);
        });
    }
}

从该请求中,无论是否存在body,我都可以获取布尔值。但无法获得实际的尸体。

1 个答案:

答案 0 :(得分:0)

您可以获取请求正文并根据需要在操作组合中记录它:

import play.Logger;
import play.mvc.Http;
import play.mvc.Result;

import java.util.concurrent.CompletionStage;

public class ClientLogger extends play.mvc.Action.Simple {

    public CompletionStage<Result> call(Http.Context context) {
        StringBuffer logMessage = new StringBuffer();
        logMessage.append(context.request().toString())
                .append("\n")
                .append("body json: " + context.request().body().asJson().toString());
        Logger.info(logMessage.toString());
        return delegate.call(context);
    }
}