【问题标题】:How can my Play 2 app respond to different "Accept" headers from the client?我的 Play 2 应用程序如何响应来自客户端的不同“接受”标头?
【发布时间】:2012-06-16 04:14:38
【问题描述】:

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

respond_to do |format|
  format.xml { ... }
  format.json { ... }
end

并根据客户端在 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(...)
  }
}

是否有一个 Play 习惯用法,或者我只是从请求中获取 Accept 标头的值?

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案1】:

    在 Play 2.1 中,您可以编写以下代码:

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

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

    (注意:您可能也对this answer 感兴趣,以了解Java 中的类似问题)

    【讨论】:

    • Action { case Accepts.Xml() => Ok({e.message}); case Accepts.Json() => Ok(…) }
    • 谢谢,这看起来是我需要的——但 Play 2.1 不是还在开发中吗?
    • 该功能在之前的 Play 2.0 版本中不可用,因此您必须等待 2.1 版本发布,或者您可以自己构建 Play
    • 我在 Heroku 上,所以构建我自己的并非易事。 2.1 离正式发布还有多远?
    • 如果您现在需要它们,并且您可以接受稍后删除解决方法(切换到 2.1 时),您可以简单地从分支中获取该功能。实际上,它们只是提取器...查看标题,blahblhablha ^^
    【解决方案2】:

    我刚刚发布了一个 Play!用于内容协商的 2.0 模块称为 mimerender (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!")
      }
    }
    

    请注意,这是一个非常早的版本,仅在 Play 2.0.4 上进行了测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      相关资源
      最近更新 更多