如何处理带有 PUT 或 DELETE HTTP 请求的可选 body(在 Play 应用程序中)?
How to handle optional body with PUT or DELETE HTTP Requests (in a Play Application)?
reservation
是一个有 4 个字段的资源,它们是 id
、dataCenter
、startDate
、endDate
我希望处理这两种类型的请求:
其中有一个 body 和一个数据中心列表
其中他们不发送 body(在这种情况下,我将对数据库中存在的所有数据中心执行操作)。
没有body:
PUT /reservation/123/end
DELETE /reservation/123
与body:
PUT /reservation/123/end
{
"dataCenters": ["AMS", "CLT"]
}
DELETE /reservation
{
"dataCenters": ["AMS", "CLT"]
}
问题是服务器期望 body 是有效的 JSON,即使没有 body(当 body 时情况并非如此)是空的)。处理此用例的最佳方法是什么?
我找到了一种可能的解决方案,不是一个干净的解决方案,但有效。
对于 PUT
Json
.fromJson[OptionalDatacenters](request.body.asJson.getOrElse(JsArray()))
.getOrElse(OptionalDatacenters(None))
.dataCenters
删除
Action.async(parse.raw) { request =>
val dataCenters =
request.body
.asBytes()
.map(
bytes =>
if (bytes.size > 1) Json.parse(bytes.toArray).as[OptionalDatacenters]
else OptionalDatacenters(None)
)
.getOrElse(OptionalDatacenters(None))
.dataCenters
reservation
是一个有 4 个字段的资源,它们是 id
、dataCenter
、startDate
、endDate
我希望处理这两种类型的请求:
其中有一个 body 和一个数据中心列表
其中他们不发送 body(在这种情况下,我将对数据库中存在的所有数据中心执行操作)。
没有body:
PUT /reservation/123/end
DELETE /reservation/123
与body:
PUT /reservation/123/end
{
"dataCenters": ["AMS", "CLT"]
}
DELETE /reservation
{
"dataCenters": ["AMS", "CLT"]
}
问题是服务器期望 body 是有效的 JSON,即使没有 body(当 body 时情况并非如此)是空的)。处理此用例的最佳方法是什么?
我找到了一种可能的解决方案,不是一个干净的解决方案,但有效。
对于 PUT
Json
.fromJson[OptionalDatacenters](request.body.asJson.getOrElse(JsArray()))
.getOrElse(OptionalDatacenters(None))
.dataCenters
删除
Action.async(parse.raw) { request =>
val dataCenters =
request.body
.asBytes()
.map(
bytes =>
if (bytes.size > 1) Json.parse(bytes.toArray).as[OptionalDatacenters]
else OptionalDatacenters(None)
)
.getOrElse(OptionalDatacenters(None))
.dataCenters