我正在学习Java中的Play Framework。
我无法清楚地了解Response和Result之间的区别。我的意思是,实际发回的是什么,结果还是两者兼而有之?响应是结果的一部分吗?
我一直试图查看源代码。响应包含Cookie和Map作为标题。结果包含Cookie和ResponseHeader,以及更多内容,如正文和会话。所以有一些重叠。
更令我困惑的是这样的代码:
public Result index() {
response().setHeader(CACHE_CONTROL, "max-age=3600");
response().setHeader(ETAG, "xxx");
return ok("<h1>Hello World!</h1>").as("text/html");
}
我跟踪调用源代码的ok()函数到Result的构造函数,它似乎没有使用response()函数返回的Context中的Response对象中的任何数据。
所以我的问题是:
因此,在回复之前,Response中的Cookie和标题最终会与Framework中的Cookie和标题结合使用吗?
如果是这样,那么制作2个课程而不是一个课程的理由是什么,并将cookie /标题放在2个地方?
如果没有,结果是否包含我尚未发现的响应数据?
答案 0 :(得分:6)
play.api.mvc.Result
表示HTTP响应;它封装了状态代码,HTTP标头和要发送到Web客户端的主体。
Play提供助手来创建创建常见结果,例如ok(responseBody)
是具有Http Status 200的Result
的快捷方式。
您的控制器通常会使用其中一种静态帮助程序方法返回Result
来创建Result实例。但是,您可能希望使用Result
静态帮助程序方法调整response()
实例封装的HTTP响应,或许可以设置标头值。
此帮助器方法在线程局部变量(Context.current()
)中设置响应头,Play将此线程局部变量传播到处理HTTP响应回调的线程,并在该调用中JavaHelpers.createResult(…)
转换{ {1}}实例到其Scala表单并调用play.mvc.Result
和withCookies()复制通过withHeaders()
调用提供的任何标头和Cookie。
所以,在您发布的代码中:
response()
public Result index() {
response().setHeader(CACHE_CONTROL, "max-age=3600");
response().setHeader(ETAG, "xxx");
return ok("<h1>Hello World!</h1>").as("text/html");
}
调用在线程局部变量上设置标头,response()
调用创建ok()
并在将此play.mvc.Result
返回给客户端的过程中播放副本你提供给那个结果的标题。
我认为这回答:
因此,在回复之前,Response中的Cookie和标题最终会与Framework中的Cookie和标题结合使用吗?
至于这部分问题......
如果是这样,那么制作2个课程而不是一个课程的理由是什么,并将cookie /标题放在2个地方?
...我认为只有Play作者可以解释为什么选择此实现。也许这是Play双头的结果,Java实现是Scala基础的薄包装。但是,从Play用户的角度来看,您可能已经知道通过Result
设置的任何内容都将与您创建的response()
合并。