使用 Play 表单实现 PATCH 操作
Implement PATCH operation with Play forms
您好,我在使用 Play 框架和表单(根据 https://www.rfc-editor.org/rfc/rfc6902)实施补丁操作时遇到了一些麻烦。这个想法是然后对补丁操作进行模式匹配来决定要采取什么行动。到目前为止我做了什么:
val myForm = Form(
tuple(
"op" -> text.verifying(List("replace", "add").contains(_)),
"path" -> text.verifying(List("/X", "/Y").contains(_)),
"value" -> of[AnyRef] //does not compile :'(
)
)
导致以下错误:“找不到 AnyRef 的格式化程序类型 class。”
我知道我的值字段可以是不同的类型,具体取决于目标子资源,我该如何解决这个问题?
我最终没有使用 Play Forms,而是使用基本阅读器,做了类似的事情:
case class PatchOperation(operation: String, path: String, value: JsValue)
implicit val patchOperationReads: Reads[PatchOperation] = (
(JsPath \ "op").read[String] and
(JsPath \ "path").read[String] and
(JsPath \ "value").read[JsValue]
) (PatchOperation.apply _)
在我的控制器中
request.body.asJson.map(js => js.validate[PatchOperation] match {
case JsSuccess(patch, path) => {
patch match {
case PatchOperation("replace", "/subresource1", value) =>
//here do something and parse the value
case PatchOperation("add", "/subresource1", value) =>
//here do something and parse the value
case _ => BadRequest
}
}
case JsError(patchOperation) => BadRequest
}) getOrElse BadRequest
您好,我在使用 Play 框架和表单(根据 https://www.rfc-editor.org/rfc/rfc6902)实施补丁操作时遇到了一些麻烦。这个想法是然后对补丁操作进行模式匹配来决定要采取什么行动。到目前为止我做了什么:
val myForm = Form(
tuple(
"op" -> text.verifying(List("replace", "add").contains(_)),
"path" -> text.verifying(List("/X", "/Y").contains(_)),
"value" -> of[AnyRef] //does not compile :'(
)
)
导致以下错误:“找不到 AnyRef 的格式化程序类型 class。”
我知道我的值字段可以是不同的类型,具体取决于目标子资源,我该如何解决这个问题?
我最终没有使用 Play Forms,而是使用基本阅读器,做了类似的事情:
case class PatchOperation(operation: String, path: String, value: JsValue)
implicit val patchOperationReads: Reads[PatchOperation] = (
(JsPath \ "op").read[String] and
(JsPath \ "path").read[String] and
(JsPath \ "value").read[JsValue]
) (PatchOperation.apply _)
在我的控制器中
request.body.asJson.map(js => js.validate[PatchOperation] match {
case JsSuccess(patch, path) => {
patch match {
case PatchOperation("replace", "/subresource1", value) =>
//here do something and parse the value
case PatchOperation("add", "/subresource1", value) =>
//here do something and parse the value
case _ => BadRequest
}
}
case JsError(patchOperation) => BadRequest
}) getOrElse BadRequest