2017-07-28 1 views
0

reservation ist eine Ressource mit 4 Feldern Sie sind id, dataCenter, startDate, endDateWie behandelt man optionalen Körper mit PUT oder DELETE HTTP Requests (in einer Play-Anwendung)?

ich beiden Arten von Anfragen bearbeiten möchte:

  1. , in dem ein Körper dort mit einer Liste von datacenter ist

  2. In denen sie keinen Körper senden (in diesem Fall werde ich die Operation auf alle DatenCenter, die in der Datenbank vorhanden sind) durchführen.

Ohne Körper:

PUT /reservation/123/end

DELETE /reservation/123

Mit Körper:

PUT /reservation/123/end

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

DELETE /reservation

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

Das Problem der Server wird erwartet, dass der Körper auch eine gültige JSON sein, wenn es keinen Körper ist (was nicht der Fall ist, wenn der Körper leer ist). Was wäre der beste Weg, um diesen Anwendungsfall zu behandeln?

Antwort

0

Ich fand eine mögliche Lösung, nicht eine saubere, aber funktioniert.

Für PUT

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

Für 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 
Verwandte Themen