【发布时间】:2012-06-18 18:36:37
【问题描述】:
我正在尝试使用 PlayFramework 编写一个 DRY CRUD 宁静服务。这是它的代码。
def crudUsers(operation: String) = Action(parse.json) { request =>
(request.body).asOpt[User].map { jsonUser =>
try {
DBGlobal.db.withTransaction {
val queryResult = operation match {
case "create" =>
UsersTable.forInsert.insertAll(jsonUser)
Json.generate(Map("status" -> "Success", "message" -> "Account inserted"))
case "update" =>
val updateQ = UsersTable.where(_.email === jsonUser.email.bind).map(_.forInsert)
println(updateQ.selectStatement)
updateQ.update(jsonUser)
Json.generate(Map("status" -> "Success", "message" -> "Account updated"))
case "retrieve" =>
val retrieveQ = for(r <- UsersTable) yield r
println(retrieveQ.selectStatement)
Json.generate(retrieveQ.list)
case "delete" =>
val deleteQ = UsersTable.where(_.email === jsonUser.email)
deleteQ.delete
Json.generate(Map("status" -> "Success", "message" -> "Account deleted"))
}
Ok(queryResult)
}
} catch {
case _ =>
val errMsg: String = operation + " error"
BadRequest(Json.generate(Map("status" -> "Error", "message" -> errMsg)))
}
}.getOrElse(BadRequest(Json.generate(Map("status" -> "Error", "message" -> "error"))))
} }
我注意到更新、删除和创建操作运行良好。但是,检索操作失败并显示For request 'GET /1/users' [Invalid Json]。我很确定这是因为 JSON 解析器不能容忍在正文中没有传递 JSON 的 GET 请求。
有没有办法在不丢失我在这里开始的 DRY 方法的情况下对 GET/Retrieve 操作进行特殊处理?
【问题讨论】:
-
JSON 要求存在顶级 JSON 对象或 JSON 数组。 “无数据”不是有效的 JSON。见RFC4627:
JSON-text = object / array。 -
好的。谢谢。似乎另一种选择是构建一个更智能的解析器,它只能接受获取请求的文本内容。知道我该怎么做吗?