2013-12-11 15 views
2

我正在使用Play 2.2.1,我试图编写自己的Action来处理CORS请求。我发现this,但不幸的是它不能编译。用Play's EssentialAction创作

仅供参考这里的(略有修改)代码:

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" 
    )) 
    } 
    } 
} 

的错误是:

Cors.scala:13: not found: value Ok 

我很新的Scala和更是如此玩!并无法弄清楚发生了什么。据我所知我使用EssentialAction,而不仅仅是行动B/C我想要的请求的标题。到目前为止,我发现的所有例子都只涉及Action。

回答

5

正如威尔说你缺少的Results特质。

一个实施CorsAction是使用ActionBuilders作为 http://www.playframework.com/documentation/2.2.x/ScalaActionsComposition

实施描述是这样可能更清洁的方式:

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 
     )) 
    } 
    } 
} 
+0

这应该POST请求也行 - 正确的吗?获取用于POST端点的预检请求的404 – smk