Play框架中的响应和结果如何相关?

Hai*_*jin 5 java playframework playframework-2.0

我正在学习Java中的Play Framework.

我无法清楚地理解响应结果之间的区别.我的意思是,实际发回的是什么,结果还是两者兼而有之?响应是结果的一部分吗?

我一直在试着查看源代码.响应包含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");
}
Run Code Online (Sandbox Code Playgroud)

我将源代码中调用的ok()函数跟踪到Result的构造函数,并且它似乎没有使用response()函数返回的Context中的Response对象中的任何数据.

所以我的问题是:

因此,在回复之前,响应中的cookie和标题最终将与框架中的Cookie和标题结合使用?

如果是这样,制作2个课而不是一个课的理由是什么,并将饼干/标题放在2个地方?

如果没有,结果是否包括响应数据,我还没有发现?

gly*_*ing 6

A play.api.mvc.Result表示HTTP响应; 它封装了状态代码,HTTP标头和要发送到Web客户端的主体.

Play提供助手来创建创建常见结果,例如 ok(responseBody)ResultHttp Status 200 的快捷方式.

您的控制器通常会返回一个Result使用其中一个静态帮助程序方法来创建Result实例.但是,您可能希望Result通过使用response()静态帮助程序方法调整实例封装的HTTP响应,可能是设置标头值.

这种辅助方法设置在一个线程本地变量的响应报头(Context.current()),播放传播这个线程本地变量,其处理HTTP响应回调并且在调用的线程JavaHelpers.createResult(…)的转换play.mvc.Result实例其Scala的形式,并且调用withHeaders()和withCookies()复制任何标头和通过response()调用提供的cookie .

所以,在您发布的代码中:

public Result index() {
    response().setHeader(CACHE_CONTROL, "max-age=3600");
    response().setHeader(ETAG, "xxx");
    return ok("<h1>Hello World!</h1>").as("text/html");
}
Run Code Online (Sandbox Code Playgroud)

response()电话上设置一个线程局部变量标题,则ok()调用创建一个play.mvc.Result和这个返回的过程中Result,以客户端播放您复制到该结果所提供的标题.

我认为这回答了:

因此,在回复之前,响应中的cookie和标题最终将与框架中的Cookie和标题结合使用?

至于这部分问题......

如果是这样,制作2个课而不是一个课的理由是什么,并将饼干/标题放在2个地方?

...我认为只有Play作者可以解释为什么选择这个实现.也许这是Play双头的结果,Java实现是Scala基础的薄包装.但是,从Play用户的角度来看,知道您设置的任何内容response()都将与Result您创建的内容合并,这可能就足够了.