1

認証にアクション構成を使用し、各アクションで共通のパラメーターを渡さないようにしています。私の質問は、以下の方法のように、BodyParser parse.json とどのように組み合わせることができますか?

def setUser() = Action(parse.json) {
  implicit request =>
    val id = (request.body \ "id").as[String]
    val username = (request.body \ "username").as[String]
    val previousURI = request.session.get("previousURI") match {
      case Some(x) => x
      case None => "/"
    }
    Ok(previousURI).withSession(
      "id" -> id,
      "username" -> username
    )
}

上記のメソッドを使用するコントローラーは、「Auth」トレイトを使用します。

case class User(id: Option[String], username: Option[String])

case class Context(user: User, request: Request[AnyContent])
  extends WrappedRequest(request)

trait Auth {

  def CheckLogin(f: Context => Result) = {

    Action { request =>
      request.session.get("username").map { token =>
        // username? yes continue...
        val id = request.session.get("id")
        val username = request.session.get("username")
        f(Context(new User(id, username), request))
      }.getOrElse {
        // no redirect to login
        Results.Redirect(routes.Application.login).withSession(
          "previousURI" -> request.uri
        )
      }

    }

  }

}

私が試してみると:

def myMethod() = CheckLogin(parse.json) { ...

私は得る:

type mismatch; found : play.api.mvc.BodyParser[play.api.libs.json.JsValue] required: controllers.Context => play.api.mvc.Result

ありがとう!

4

1 に答える 1

2

私自身の質問に答えますが、これが最もエレガントかどうかはまだわかりませんが、機能します。

def CheckLogin(bp: BodyParser[AnyContent] = parse.anyContent)(f: Context => Result) = {
    Action(bp) { request =>
    // ...

CheckLoginこれで、デフォルトでBodyParserがparse.anyContent追加され、他のBodyParsersも受け入れることができるようになりました。parse.json

于 2013-02-25T07:05:44.993 に答える