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

时间:2017-07-29 15:29:40

标签: java playframework playframework-2.0

我正在学习Java中的Play Framework。

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

我一直试图查看源代码。响应包含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个地方?

如果没有,结果是否包含我尚未发现的响应数据?

1 个答案:

答案 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()合并。