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

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

产量

第一个:{..my content..},第二个:无

更新:Jooby 库,仅供参考 https://jooby.org

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

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

4

2 回答 2

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,它将不起作用。

于 2019-06-07T08:56:47.003 回答
1

看起来不像。

Joobyin参数(request.body最终将解析为)实现为InputStream. AnInputStream不能被倒带,并且它没有任何上下文或能力这样做。因此,多次调用 ofrequest.body()将使您的请求正文恰好一次

于 2018-05-04T19:40:06.807 回答