我的Play 2应用程序如何响应来自客户端的不同"Accept"标题?

Bil*_*ill 10 scala playframework-2.0

在Rails中,我能够做类似以下的事情:

respond_to do |format|
  format.xml { ... }
  format.json { ... }
end
Run Code Online (Sandbox Code Playgroud)

并根据客户端在Accept标头中提供的内容执行相应的块.

我怎么能在Play 2.0(Scala)中做同样的事情?

我希望做一些看起来像这样的事情:

try {
  Resources.delete(id)
  Ok("done")
} 
catch { 
  case e: ClientReportableException =>
    ?? match { 
      case "application/xml" => Ok(<error>{e.message}</error>)
      case "application/json" => Ok(...)
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有Play成语,或者我只是从请求中获取Accept标头的值?

Jul*_*Foy 14

在Play 2.1中,您可以编写以下内容:

request match {
  case Accepts.Xml() => Ok(<error>{e.message}</error>)
  case Accepts.Json() => Ok(…)
}
Run Code Online (Sandbox Code Playgroud)

案例语句按照它们的写入顺序进行尝试,因此如果您的客户端将HTTP Accept标头设置*/*为第一个,则匹配(在此示例中case Accepts.Xml()).因此,您通常希望首先编写Accepts.Html()案例,因为浏览器将Accept标头设置为*/*.

(注意:您可能也对Java中类似问题的答案感兴趣)