Вопрос по playframework-2.0, scala – Как мое приложение Play 2 может реагировать на различные заголовки «Принять» от клиента?

10

В 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 из запроса?

Ваш Ответ

2   ответа
1

Я только что выпустил 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.

14

В Play 2.1 вы можете написать следующее:

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

Заявления дел проверяются в порядке их написания, поэтому, если ваш клиент устанавливает HTTPAccept заголовок к*/* первый будет соответствовать (в этом примереcase Accepts.Xml()). Итак, вы обычно хотите написатьAccepts.Html() дело в первую очередь, потому что браузеры устанавливаютAccept заголовок к*/*.

(Примечание: вы также можете быть заинтересованы вэтот ответ за похожий вопрос в Java)

Если они вам нужны сейчас, и вы можете согласиться удалить обходной путь позже (при переходе на 2.1), вы можете просто взять эту функцию из ветви. На самом деле, они просто экстракторы ... заглядывая в заголовки, blahblhablha ^^
Я на Heroku, так что строить свой собственный нетривиально. Насколько далеко находится 2.1 от общего выпуска? Bill
Спасибо, это похоже на то, что мне нужно, но разве Play 2.1 все еще в разработке? Bill
Эта функция недоступна в предыдущих выпусках Play 2.0, поэтому вам придется подождать выпуска 2.1 или создать Play самостоятельно.
Action {case Accepts.Xml () = & gt; Хорошо (& л; сообщение & GT; {e.message} & л; / сообщение & GT;); case Accepts.Json () = & gt; Хорошо (& # x2026;)}

Похожие вопросы