Vert-X + Groovy: aujourd’hui: le POST

Aujourd’hui ce sera court: “comment rĂ©pondre Ă  une requĂȘte de type POST”.

Request body

Avant toute chose, il faut activer la capacitĂ© de Vert-x Ă  lire le body au moment de la requĂȘte. Il faut donc ajouter ceci dans votre code:

router.route().handler(BodyHandler.create())

Dans ce cas, nous activons la possibilitĂ© pour l’ensemble des routes, mais il est possible de le faire que pour une partie, par exemple ici, uniquement pour les “routes en dessous” de /api/humans:

router.route().handler(BodyHandler.create("/api/humans*"))

GĂ©rer le POST

Notre code est trĂšs simple:

import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import io.vertx.groovy.ext.web.Router
import io.vertx.groovy.ext.web.handler.BodyHandler
import io.vertx.groovy.ext.web.handler.StaticHandler

def server = vertx.createHttpServer()
def router = Router.router(vertx)

// activate reading of request body
router.route().handler(BodyHandler.create())

router.post("/api/humans").handler({ context ->

  def jsonSlurper = new JsonSlurper()
  // create an object from the body content
  def obj = jsonSlurper.parseText(context.getBodyAsString())
  // add an id to the object
  obj.id = new Random().nextInt(100)

  // cast the object to json string and send the result
  context
      .response()
      .putHeader("content-type", "application/json")
      .end(JsonOutput.toJson(obj))
})

router.route("/*").handler(StaticHandler.create())

server.requestHandler(router.&accept).listen(8080)
  • Nous avons eu juste Ă  activer la lecture du “request body”: router.route().handler(BodyHandler.create())
  • Et ensuite Ă  le lire et le transformer en une chaĂźne json: jsonSlurper.parseText(context.getBodyAsString())

Vous pouvez tester facilement votre route:

curl -H "Content-Type: application/json" -X POST -d '{"firstName":"Bob","lastName":"Morane"}' http://localhost:8080/api/humans

Et vous devriez obtenir quelque chose comme ceci:

{"firstName":"Bob","id":42,"lastName":"Morane"}

Json selon Vert-x

Jusqu’ici, j’utilisais les capacitĂ©s de Groovy Ă  gĂ©rer le Json. Mais sachez que Vert-X propose aussi l’outillage json nĂ©cessaire par le biais du package io.vertx.core.json.Json, donc ajouter un import dans votre code: import io.vertx.core.json.Json. Puis continuons Ă  coder.

Créez une classe Human:

class Human {
  public Integer id
  public String firstName
  public String lastName
}

puis créez la route suivante:

router.post("/api/2/humans").handler({ context ->

  Human bob = Json.decodeValue(context.getBodyAsString(), Human.class)
  bob.id = new Random().nextInt(100)

  context
      .response()
      .putHeader("content-type", "application/json")
      .end(Json.encodePrettily(bob))
})
  • Json.decodeValue permet de “mapper” votre json sur une instance de classe
  • Json.encodePrettily permet de transformer votre instance en une “jolie” json string

Vous pouvez tester facilement votre route:

curl -H "Content-Type: application/json" -X POST -d '{"firstName":"Bob","lastName":"Morane"}' http://localhost:8080/api/2/humans

Et vous devriez obtenir quelque chose comme ceci:

{
  "id" : 76,
  "firstName" : "Bob",
  "lastName" : "Morane"
}

Je vous laisse découvrir seuls comment faire un PUT ou un DELETE (la doc et les exemples sont trÚs bien faits). La prochaine fois nous verrons comment simplifier notre code grùce à quelques spécificités de Groovy.

Bon Dimanche :)

blog comments powered by Disqus

Related posts