Actions, Controllers and Results【翻译】

原文:https://www.playframework.com/documentation/2.5.x/ScalaActions

什么是Action?

一个Play应用接收的大多数请求都是通过Action处理的。

一个play.api.mvc.Action就是一个 (play.api.mvc.Request => play.api.mvc.Result)函数,这个函数处理请求并生成发送给客户端的结果。

defecho= Action { request => Ok("Got request ["+ request +"]") }

一个Action返回一个play.api.mvc.Result 值,这个值代表HTTP发送给网络客户端的响应。在这个例子中Ok 构建了一个含有text/plain响应体的200 OK 的响应。

构建一个Action

play.api.mvc.Action 伴生对象提供了几个比较有用的方法来构建Action值。

第一个最简单的方式仅用一个表达式块作为参数,返回结果:

Action { Ok("Hello world") }

这是创建Action的最简单的方式,但是我们不能获取到发送来的请求的引用。通常情况下,调用这个Action的HTTP请求是有用的。

因为可以使用另一个使用函数Request => Result作为参数的Action构建器:

Action { request => Ok("Got request ["+ request +"]") }

标记request参数为implicit,一般都很有用, 因此它可以被需要它的Api隐式使用:

Action {implicitrequest => Ok("Got request ["+ request +"]") }

创建Action值的最后一种方式是指定一个额外的BodyParser参数:

Action(parse.json) {implicitrequest => Ok("Got request ["+ request +"]") }

Body分析器将会在这个手册的后面讲到。现在你只需要知道使用默认的使用任何内容的Body分析器来创建Action值的其他方法,

Controller是Action生成器

Controller只不过是一个生成Action值的对象。Controllers可以被定义为一个可以利用依赖注入的类或对象。

注意:记住在Play以后的版本中将不支持把Controllers定义为对象。推荐使用类。

定义对象生成器最简单的方法是使用返回Action值的无参方法:

package controllersimport play.api.mvc._classApplicationextendsController{def index = Action {    Ok("It works!")  }}

当然,Action生成器方法可以有参数,这些参数可以被Action闭包捕捉到。

defhello(name:String) =Action{Ok("Hello "+ name) }

简单结果

现在我们仅把关注点放到简单结果上:一个带有状态码的HTTP结果,发送到网络客户端的一组HTTP头和体。

这些结果被play.api.mvc.Result定义:

import play.api.http.HttpEntitydefindex =Action{Result(    header =ResponseHeader(200,Map.empty),    body =HttpEntity.Strict(ByteString("Hello world!"),Some("text/plain"))  )}

当然有几个创建通用结果的比较有用的方法,如上面例子的Ok结果:

defindex =Action{Ok("Hello world!") }

这个生成和上面完全一样的结果。

这里是创建其他结果的几个例子:

val ok=Ok("Hello world!")

val notFound=NotFound

val pageNotFound=NotFound(Pagenotfound)

val badRequest=BadRequest(views.html.form(formWithErrors))

val oops=InternalServerError("Oops")

val anyStatus=Status(488)("Strange response type")

这些所有的帮助方法可以在 play.api.mvc.Results特质中和伴生类中发现。

重定向也是一个简单结果

重定向浏览器到一个新的URL的是另一个简单的结果。然而,这些结果类型没有携带响应体。

这是几个创建跳转结果的有用的帮助类:

defindex =Action{Redirect("/user/home") }

默认使用303 SEE_OTHER 应答体,但是如果你需要一个的话你可以设置一个更多特定状态码的应答体:

defindex =Action{Redirect("/user/home",MOVED_PERMANENTLY) }

TODO虚拟页面

你可以使用定义为TODO的空的Action实现: 结果是标准的“还没有实现”结果页:

defindex(name:String) =TODO

你可能感兴趣的:(Actions, Controllers and Results【翻译】)