【发布时间】:2013-10-18 10:37:30
【问题描述】:
我是新手和 scala,所以很难弄清楚一些基本的东西。我正在尝试实现的是 api 身份验证。为了实现它,我在 zentask 示例中实现了类似于 Security trait 的类似身份验证操作。
但是当我试图在安全特征中访问请求的 json 主体时,我得到编译器错误说; "值 \ 不是类型参数 A 的成员"
这里是授权操作;
def withApiAuth[A](bp: BodyParser[A])(f: Request[A] => Result): Action[A] = {
Action(bp) { request =>
val chargeJson = request.body
val appId:Option[String] = (chargeJson \ "appid").asOpt[String]
if(appId.isDefined){
Logger.info("Api request" + appId)
f(request)
}
else{
Results.BadRequest("unfortunately")
}
}
}
我在这样的控制器中使用它;
def pay = withApiAuth(parse.json){ request =>
val chargeJson = request.body
println(chargeJson)
Ok("helo")
}
我错过了什么?
【问题讨论】:
-
我不太确定你想用
withApiAuth完成什么。您收到该编译错误是因为编译器不知道主体解析器是withApiAuth中的json。如果您的意图是在每个请求中传递 json,那么 body 解析器不应该是一个参数,但这将严重限制该函数的使用。 -
其实我想要完成的是,所有用withApiAuth组成的动作都应该是json内容的http请求。并且还应该在正文中包含一个应用程序 ID。这样我就不需要在每个动作中一次又一次地实施这些。我想要一个可重用的动作块,它只接受 json 请求并提供一个简单的身份验证机制。
-
您可以将
bp: BodyParser[A]替换为 parse.json,因为您只希望正文解析器为 json。这当然会阻止您使用 POST 表单或任何其他请求正文。而且它不是一种远程安全的身份验证形式。 -
感谢实际工作的人。将其发布为 anwser,以便我可以标记它。
标签: json scala playframework-2.2