Content negotiation

原文:Content negotiation

内容协商是一个让相同资源(URI)的不同表现成为可能的机制。它是有用的,如,为了写一个支持多种输出格式(XML, JSON, 等等)的Web Services。本质上,服务端驱动的协商是使用了 Accept* 请求的头执行。你可以在HTTP规范中找到更多关于内容协商的信息。

语言

Play在方法play.api.mvc.Controller#lang中使用它,这个方法提供一个隐式的 play.api.i18n.Lang 值给你的Action,因此他们自动的使用了最佳的语言(如果你的应用支持,否则你的应用的默认语言会被使用)。

内容

实际上,Accept 头没有真的包含MIME 类型而是媒体范围(例如,请求接受所有的文本结果会设置为 text/* 范围,而/ 范围意味着所有的结果类型都接受)。Controllers 提供一个较高水平的render 方法来帮助你处理媒体范围。例如考虑下面的Action定义:

val list = Action { implicit request =>  
val items = Item

继续阅读»»»

Action composition【翻译】

原文:Action composition

这章将介绍几种定义常用Action函数的方式。

自定义Action构建器

我们在前面看到过,有几种声明Action的方式——使用Request参数,不使用request参数,使用Body解析器等等。事实上,正如我们将在异步编程章节看到的. 还有更多的方式。

实际上,这些构建Action的方法都是通过一个叫 ActionBuilder 的特质定义的,并且我们用来声明我的Action的Action对象只是这个特质的实例。通过实现你自己的ActionBuilder, 你可以声明一个可被重复使用的Action栈,然后这可以被用来构建Action。

让我们从一个简单的日志装饰的例子开始,我想记录每次对这个Action的调用。第一种方式是在invokeBlock 方法中实现这个功能,这个方法通过ActionBuilder构建每个Action时调用:

import play.api.mvc._

object LoggingAction extends ActionBuilder[Request] {  
def invokeBlock[A](

继续阅读»»»

HTTP routing[翻译]

原文:HTTP routing

内置HTTP路由器

路由器的职责是负责转换每一个进入的HTTP请求给Action

一个HTTP请求可以被看做是由MVC框架的事件。这个事件包含两个主要的信息:

  • 请求路径(e.g. /clients/1542,/photos/list), 包含查询字符串
  • HTTP 方法 (e.g.GET,POST, …).

路由是在可被编译的conf/routes文件中被定义的。这意味着你可以在你的浏览器中直接看到路由的错误信息

依赖注入

Play支持生成两种路由器的类型,一个是依赖注入路由器,另一个是静态路由。默认的是依赖注入路由器,这也是在Play种子Activator模板中的样例,因此我们推荐你使用依赖注入Contrlller。如果你需要使用静态Contrller,你可以通过在你的build.sbt配置文件里添加下面这样的配置来转换到静态路由生成器:

routesGenerator:= StaticRoutesGenerator  

在Play的文档中的代码样例假定你使用了依赖注入路由生成器。如果你没有使用这个,你可以容易的改写代码样例到静态


继续阅读»»»

Actions, Controllers and Results

原文:Actions, Controllers and Results

什么是Action?

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

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

def echo = 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的最简单的方式,但是我们不能


继续阅读»»»