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 classeJson.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 :)
Tweet