我玩2个应用程序如何响应来自客户端不同的“接受”头?(How can my Play 2 app r

2019-07-29 23:33发布

在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头的值?

Answer 1:

在播放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类似的问题)



Answer 2:

我刚刚发布了一个游戏! 内容协商称为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?