Можно ли получить доступ к request.body несколько раз в jooby / java - PullRequest
0 голосов
/ 04 мая 2018
Mutant first = request.body();
Mutant second = request.body();

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

доходность

Первый: {..my content ..}, Второй: нет

Обновлено: Jooby библиотека, только для вашего FYI https://jooby.org

Использовать объект запроса: https://jooby.org/apidocs/org/jooby/request

Я посмотрел декомпилированный код, и похоже, что они не кэшируют свойство body, поэтому если вам нужен доступ к request.body () с нескольких маршрутов, хорошо ...

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Да, это возможно, но требует обходного решения.

Вы можете добавить этот блок 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, оно не будет работать.

0 голосов
/ 04 мая 2018

Не похоже на это.

Jooby реализует параметр in (к которому в конечном итоге request.body разрешится) как InputStream. InputStream не может быть перемотано, и у него не было бы никакого контекста или способности сделать это. Таким образом, множественные вызовы request.body() позволят получить тело вашего запроса точно один раз .

...