首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在jooby/java中多次访问request.body吗?

可以在jooby/java中多次访问request.body吗?
EN

Stack Overflow用户
提问于 2018-05-05 03:15:40
回答 2查看 302关注 0票数 1
代码语言:javascript
复制
Mutant first = request.body();
Mutant second = request.body();

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

yelds

第一个:{..my内容..},第二个:无

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-06-07 16:56:47

是的,这是可能的,但需要一个变通方法。

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

代码语言:javascript
复制
// 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块之前就已经被请求了,那么它就不会工作。

票数 2
EN

Stack Overflow用户

发布于 2018-05-05 03:40:07

看起来不像。

Jooby将the in parameter (which is what request.body would eventually resolve to)实现为InputStreamInputStream不能倒带,而且它不会有任何上下文或能力这样做。因此,多次调用request.body()将使您的请求体恰好一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50181762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档