如何处理带有 PUT 或 DELETE HTTP 请求的可选 body(在 Play 应用程序中)?

How to handle optional body with PUT or DELETE HTTP Requests (in a Play Application)?

reservation 是一个有 4 个字段的资源,它们是 iddataCenterstartDateendDate

我希望处理这两种类型的请求:

  1. 其中有一个 body 和一个数据中心列表

  2. 其中他们不发送 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