Можно ли получить доступ к request.body несколько раз в jooby/java

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

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

yelds

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

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

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

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

1 ответ

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

Вы можете добавить это useblock в качестве первой строки в вашем приложении. Это позволяет вам получить доступ к телу несколько раз через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 блок, это не сработает.

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

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

Другие вопросы по тегам