繁体   English   中英

如何在Play 2.3中自定义操作组合以记录请求和响应?

[英]How to do custom action composition to log request and response in Play 2.3?

我正在使用Play 2.3(Java)应用程序,并且需要自定义操作组合来记录请求和响应。 到目前为止,我能得到请求的内容,但没有响应:

import play.libs.F;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.Result;

public class LogAction extends Action.Simple {

    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        //Request body
        String requestBody = ctx.request().body().asText();
        //Need to get response body here
        //String responseBody = ???
        return delegate.call(ctx);
    }

}

在这种情况下,如何获得响应正文? 如果在Java中很难做到,那么它也可能在scala中,但是它必须使用Java控制器方法@With注解。

    @Override
    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        Promise<Result> call = delegate.call(ctx);
        return call.map((r) -> {
            byte[] body = JavaResultExtractor.getBody(r, 0l);
            Logger.info(new String(body));
            return r;
        });
    }

您可以使用play.core.j.JavaResultExtractor从响应中提取主体。 请记住, getBody(..)阻塞直到响应准备就绪,因此请考虑调用onRedeem而不是map

您是否尝试过以下方法:

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

    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        Logger.info("Calling action for " + ctx);
        F.Promise<Result> resultPromise = delegate.call(ctx);
        resultPromise.map(result -> {
            Logger.info(result.toScala().header().status());
            Logger.info(result.toScala().body().toString());
            return result;
        });
        return resultPromise;
    }
}

该主体将作为play.api.libs.iteratee.Enumerator返回。 现在,最困难的部分是与此相关的工作。 首先,您需要了解Iteratee的概念以及Enumerator在其中扮演的角色。 提示:想的Enumerator数据的生产者和想的Iteratee因该数据的消费者

现在,在此Enumerator您可以运行 Iteratee ,它将数据块转换为所需的类型。

坏消息是您需要实现play.api.libs.iteratee.Iteratee特性。 如您所见,它位于api子包中,这意味着它是Play中Scala世界的一部分。 也许在这种情况下,将Scala用于任务的这一部分会容易得多。 不幸的是,我无法为您提供一些示例实现,但是我希望这不会那么难。 我认为这在Play的Java方面确实缺少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM