如何使用PUT或DELETE HTTP请求处理可选主体(在Play应用程序中)?

时间:2017-07-28 09:49:46

标签: rest api http playframework-2.0 api-design

reservation是包含4个字段的资源。iddataCenterstartDateendDate

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

  1. 其中有一个带有dataCenters列表的正文

  2. 他们不发送正文(在这种情况下,我将对数据库中存在的所有dataCenters执行操作。)

  3. 没有身体:

    PUT /reservation/123/end

    DELETE /reservation/123

    身体:

    PUT /reservation/123/end

    {
        "dataCenters": ["AMS", "CLT"]
    }
    

    DELETE /reservation

    {
        "dataCenters": ["AMS", "CLT"]
    }
    

    服务器的问题是即使没有正文,也要求正文是有效的JSON(当正文为空时不是这种情况)。处理这个用例的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我找到了一个可能的解决方案,而不是一个干净的解决方案,但是有效。

对于PUT

    Json
    .fromJson[OptionalDatacenters](request.body.asJson.getOrElse(JsArray()))
    .getOrElse(OptionalDatacenters(None))
    .dataCenters

对于DELETE

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