scala playframework playframework-2.0 playframework-2.2

scala - Componer con EssentialAction de Play



playframework playframework-2.0 (2)

Estoy usando Play 2.2.1 y estoy tratando de escribir mi propia Acción para lidiar con las solicitudes CORS. Encontré esto pero desafortunadamente no compila.

Solo como referencia, aquí está el código (ligeramente modificado):

import play.api.mvc._ import scala.concurrent.ExecutionContext case class CorsAction(action: EssentialAction) extends EssentialAction { def apply(request: RequestHeader) = { implicit val executionContext: ExecutionContext = play.api.libs.concurrent.Execution.defaultContext val origin = request.headers.get("Origin").getOrElse("*") if (request.method == "OPTIONS") { val cors = Action { request => Ok("").withHeaders( "Access-Control-Allow-Origin" -> origin, "Access-Control-Allow-Methods" -> "GET, POST, PUT, DELETE, OPTIONS", "Access-Control-Allow-Headers" -> "Accept, Origin, Content-type, Authorization, X-Auth-Token, " + "X-HTTP-Method-Override, X-Json, X-Prototype-Version, X-Requested-With", "Access-Control-Allow-Credentials" -> "true", "Access-Control-Max-Age" -> (60 * 60 * 24 * 30).toString) } cors(request) } else { action(request).map(res => res.withHeaders( "Access-Control-Allow-Origin" -> origin, "Access-Control-Allow-Credentials" -> "true" )) } } }

El error es:

Cors.scala:13: not found: value Ok

¡Soy muy nuevo en Scala y aún más en Play! y no puede entender lo que está pasando. Por lo que sé, tengo que usar EssentialAction y no solo Action b / c. Quiero llegar al encabezado de la solicitud. Todos los ejemplos que encontré hasta ahora solo involucran Acción.


Como dijo Will, te estás perdiendo el rasgo Results .

Una forma probablemente más limpia de implementar CorsAction sería usar ActionBuilders como se describe en http://www.playframework.com/documentation/2.2.x/ScalaActionsComposition

La implementación se vería así:

import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} object CorsAction extends ActionBuilder[Request] with Results{ val MaxAge = 60 * 60 * 24 * 30 val AllowHeaders = List( "Accept", "Origin", "Content-type", "Authorization", "X-Auth-Token", "X-HTTP-Method-Override", "X-Json", "X-Prototype-Version", "X-Requested-With") val AllowMethods = List("GET", "POST", "PUT", "DELETE", "OPTIONS") val AllowCredentials = true def cors[A](origin: String) = Ok.withHeaders( "Access-Control-Allow-Origin" -> origin, "Access-Control-Allow-Methods" -> AllowMethods.mkString(", "), "Access-Control-Allow-Headers" -> AllowHeaders.mkString(", "), "Access-Control-Allow-Credentials" -> AllowCredentials.toString, "Access-Control-Max-Age" -> MaxAge.toString) def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = { implicit val executionContext = play.api.libs.concurrent.Execution.defaultContext val origin = request.headers.get("Origin").getOrElse("*") if (request.method == "OPTIONS") { Future.successful(cors(origin)) } else { block(request).map(res => res.withHeaders( "Access-Control-Allow-Origin" -> origin, "Access-Control-Allow-Credentials" -> AllowCredentials.toString )) } } }