在Rails中,我能够做类似下面的内容:
respond_to do |format|
format.xml { ... }
format.json { ... }
end
及相应的块将基于在Accept首部提供什么客户机来执行。
我怎样才能做到在播放2.0(斯卡拉)是一回事吗?
我想看看这样做的东西看起来大致是这样的:
try {
Resources.delete(id)
Ok("done")
}
catch {
case e: ClientReportableException =>
?? match {
case "application/xml" => Ok(<error>{e.message}</error>)
case "application/json" => Ok(...)
}
}
是否有此一玩成语,还是我刚刚从获取请求中的Accept头的值?
在播放2.1,你可以写:
request match {
case Accepts.Xml() => Ok(<error>{e.message}</error>)
case Accepts.Json() => Ok(…)
}
这些案件语句试图在它们的排列顺序,因此,如果您的客户端设置HTTP Accept
头*/*
第一个将匹配(在本例case Accepts.Xml()
所以,你通常要写入Accepts.Html()
第一种情况,因为浏览器设置的Accept
头*/*
。
(注意:您还可能有兴趣在这个答案在Java类似的问题)
我刚刚发布了一个游戏! 内容协商称为mimerender 2.0模块( http://github.com/martinblech/play-mimerender )。
这个想法是,你必须从你的域类不同的表述定义的映射:
val m = mapping(
"text/html" -> { s: String => views.html.index(s) },
"application/xml" -> { s: String => <message>{s}</message> },
"application/json" -> { s: String => toJson(Map("message" -> toJson(s))) },
"text/plain" -> identity[String]_
)
一旦你这样做,有一次,你可以重复使用在所有的控制器,映射:
object Application extends Controller {
def index = Action { implicit request =>
m.status(200)("Hello, world!")
}
}
请注意,这是一个非常早期版本,并只播放2.0.4进行了测试
文章来源: How can my Play 2 app respond to different “Accept” headers from the client?