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