是否可以在jooby / java

时间:2018-05-04 19:15:40

标签: java jooby

Mutant first = request.body();
Mutant second = request.body();

log.info("First: {}, Second: {}", first, 
    Strings.isNullOrEmpty(second.value()) ? "None": second.value()
);

yelds

首先:{.. my content ..},Second:None

更新: Jooby图书馆,仅供参考 https://jooby.org

使用的Reqeust对象: https://jooby.org/apidocs/org/jooby/request

我查看了解编译的代码,看起来他们没有缓存body属性,所以如果你需要从多个路由访问request.body(),那么...

2 个答案:

答案 0 :(得分:2)

是的,这是可能的,但是需要解决方法。

您可以将此use块添加为应用程序的第一行。这使您可以通过request.body()多次访问正文。在所有情况下,如果正文太大,则正文将在内部流式传输到内存并卸载到磁盘,这种解决方法只是确保您每次都获得相同的引用。

// Cache body in request scope
use("*", "*", (req, res, chain) -> {
  final Mutant body = req.method().equalsIgnoreCase("post") ? req.body() : null;
  Request.Forwarding wrappedReq = new Request.Forwarding(req) {

    @Override
    public Mutant body() throws Exception {
      if(body != null) {
        return body;
      }
      return super.body();
    }

    @Override
    public <T> T body(Class<T> type) throws Exception {
      return body().to(type);
    }

  };
  chain.next(wrappedReq, res);
});

在此块之后定义的任何过滤器或路由将能够多次获取请求正文。如果在此use块之前已经请求了正文,它将无法正常工作。

答案 1 :(得分:1)

看起来不像。

Jooby将the in parameter (which is what request.body would eventually resolve to)作为InputStream实施。 InputStream无法重绕,也没有任何背景或能力。因此,request.body()的多次调用会使您的请求正文完全一次