2017-07-28 4 views
0

reservation est une ressource avec 4 champs Ils sont id, dataCenter, startDate, endDateComment gérer le corps optionnel avec PUT ou DELETE HTTP Requests (dans une application Play)?

Je souhaite gérer les deux types de demandes:

  1. où il y a un corps avec une liste des Datacenters

  2. Dans lequel ils n'envoient pas de corps (dans ce cas, j'effectuerai l'opération sur tous les dataCenters présents dans la base de données).

Sans corps:

PUT /reservation/123/end

DELETE /reservation/123

Avec le corps:

PUT /reservation/123/end

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

DELETE /reservation

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

Le problème étant le serveur attend le corps d'être un JSON valide même quand il n'y a pas de corps (ce qui est le cas lorsque le corps est vide). Quelle serait la meilleure façon de gérer ce cas d'utilisation?

Répondre

0

J'ai trouvé une solution possible, pas une solution propre, mais ça marche.

Pour PUT

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

Pour SUPPRIMER

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