Play Framework 中的 Response 和 Result 是如何相关的?

How are Response and Result in Play Framework related?

我正在 Java 学习 Play Framework。

我无法清楚地理解Response and a Result之间的区别。我的意思是,实际发回的是什么,结果还是两者?响应是结果的一部分吗?

我一直在努力查看源代码。响应包含 Cookie 和地图 headers。结果包含 Cookies 和 ResponseHeader,以及更多类似 body 和 session 的东西。所以有一些重叠。

更让我困惑的是这样的代码:

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 object 中的任何数据。

所以我的问题是:

那么Response中的cookies和headers最终会被Framework和Result中的cookies和headers结合起来再发回吗?

而且,如果是这样,制作 2 个 类 而不是一个并将 cookies/headers 放在 2 个地方的理由是什么?

如果不是,Result 是否包含我未发现的某种方式的 Response 数据?

一个play.api.mvc.Result表示一个HTTP响应;它封装了状态代码、HTTP headers 和要发送到 Web 客户端的 body。

Play 提供助手来创建共同的结果,例如ok(responseBody)Result 的快捷方式,Http 状态为 200。

您的控制器通常会 return Result 使用其中一种静态辅助方法来创建 Result 实例。但是,您可能想要调整 Result 实例封装的 HTTP 响应,也许要设置 header 值,方法是使用 response() 静态辅助方法。

此辅助方法在线程局部变量 (Context.current()) 中设置响应 header,Play 将此线程局部变量传播到处理 HTTP 响应回调的线程,并在该调用中 JavaHelpers.createResult(…)play.mvc.Result 实例转换为其 Scala 形式并调用 withHeaders() 和 withCookies() 复制通过 response() 调用提供的任何 headers 和 cookies。

因此,在您发布的代码中:

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

response() 在线程局部变量上调用 set headers,ok() 调用创建一个 play.mvc.Result 并在 returning 的过程中此 Result 到客户端 Play 将您提供的 header 复制到该结果中。

我认为这个答案:

So the cookies and headers in Response will be finally combined with cookies and headers in Result by the Framework before sent back?

至于这部分问题……

And, if so, What's the rationale of making 2 classes rather than one, and put cookies/headers in 2 places?

…我认为只有 Play 作者才能解释 为什么选择 这个实现。也许这是 Play two-headedness 的结果,Java 实现是对 Scala 基础的简单包装。但是,从 Play 用户的角度来看,可能足以知道您通过 response() 设置的任何内容都将与您创建的任何 Result 合并。