Mutant first = request.body();
Mutant second = request.body();
log.info("First: {}, Second: {}", first,
Strings.isNullOrEmpty(second.value()) ? "None": second.value()
);
yelds
首先:{.. my content ..},Second:None
更新: Jooby图书馆,仅供参考 https://jooby.org
使用的Reqeust对象: https://jooby.org/apidocs/org/jooby/request
我查看了解编译的代码,看起来他们没有缓存body属性,所以如果你需要从多个路由访问request.body(),那么...
答案 0 :(得分:2)
是的,这是可能的,但是需要解决方法。
您可以将此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
块之前已经请求了正文,它将无法正常工作。
答案 1 :(得分:1)
看起来不像。
Jooby将the in
parameter (which is what request.body
would eventually resolve to)作为InputStream
实施。 InputStream
无法重绕,也没有任何背景或能力。因此,request.body()
的多次调用会使您的请求正文完全一次 。