【问题标题】:Is it possible to access request.body multiple times in jooby/java是否可以在 jooby/java 中多次访问 request.body
【发布时间】:2018-10-15 08:16:34
【问题描述】:
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(),嗯...

【问题讨论】:

  • 我想不会,因为这些通常是流并且流只能播放一次。您首先使用什么库来发送请求?
  • Makoto,我看不出“您使用图书馆发送请求”的相关性。在我的例子中,jooby 用于 http,所以客户端可以是任何东西,从 Chrome 和 IE 到邮递员和 curl
  • Vera:例如,您发布的代码并没有告诉我们request 的类型。所以我们不知道你期望什么样的行为是正确的。很容易猜到您是否使用了 HttpServletRequests,但该类没有 body() 方法。所以@Makoto 的问题是相关的。
  • 哦,它是jooby库,jooby.org,这个:jooby.org/apidocs/org/jooby/request,如果可以的话,我会更新原帖

标签: java jooby


【解决方案1】:

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

您可以将此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 块之前已经请求了正文,它将不起作用。

【讨论】:

    【解决方案2】:

    看起来不像。

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

    【讨论】:

    • 谢谢!我希望我缺少一个神奇的标志或配置设置......
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多