2012-06-16 5 views
10

En Rails, yo era capaz de hacer algo similar a lo siguiente:¿Cómo puede mi aplicación Play 2 responder a diferentes encabezados "Aceptar" del cliente?

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

y el bloque apropiado serían ejecutados en base a lo que el cliente suministra en la cabecera Accept.

¿Cómo puedo hacer lo mismo en Play 2.0 (Scala)?

miraría de hacer algo que se ve más o menos así:

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

¿Existe un lenguaje Juego para esto, o sólo debo buscar el valor de la cabecera Accept de la solicitud?

Respuesta

14

En juego 2.1 se puede escribir la siguiente:

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

Los casos declaraciones se trataron en el orden en que se escriben, por lo que si su cliente establece el HTTP Accept cabecera a */* el primero coincidirá (en este ejemplo case Accepts.Xml()). Por lo tanto, generalmente desea escribir el caso Accepts.Html() primero porque los navegadores configuran el encabezado Accept en */*.

(Nota: también puede estar interesado en this answer para una pregunta similar en Java)

+1

Acción {case Accepts.Xml() => Ok ( {} e.Message); case Accepts.Json() => Ok (...)} – Sadache

+0

Gracias, parece lo que necesito, pero ¿Play 2.1 aún no está en desarrollo? – Bill

+0

Esta característica no está disponible en versiones anteriores de Play 2.0, por lo que debe esperar la versión 2.1 o puede compilar Play usted mismo –

1

acabo de lanzar un juego! Módulo 2.0 para la negociación de contenido llamado mimerender (http://github.com/martinblech/play-mimerender).

La idea es que usted tiene que definir una asignación de sus clases de dominio de diferentes representaciones:

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]_ 
) 

Una vez que haya hecho eso una vez, puede volver a usar su asignación a través de todos los controladores:

object Application extends Controller { 
    def index = Action { implicit request => 
    m.status(200)("Hello, world!") 
    } 
} 

Tenga en cuenta que es un lanzamiento muy temprano y sólo se ha probado en Reproducir 2.0.4

Cuestiones relacionadas