【问题标题】:How to handle optional body with PUT or DELETE HTTP Requests (in a Play Application)?如何处理带有 PUT 或 DELETE HTTP 请求的可选正文(在 Play 应用程序中)?
【发布时间】:2017-07-28 09:49:46
【问题描述】:

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

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

  1. 其中有一个带有数据中心列表的正文

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

没有身体:

PUT /reservation/123/end

DELETE /reservation/123

有身体:

PUT /reservation/123/end

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

DELETE /reservation

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

问题是服务器期望正文是有效的 JSON,即使没有正文(正文为空时情况并非如此)。处理此用例的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

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

    对于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 2017-04-03
      • 2010-11-06
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多