Question

I started a small ratpack app in the Groovy console but I couldn't work out from the documentation how to get a hold of json data that has been sent in the request.

@Grab("io.ratpack:ratpack-groovy:0.9.4")
import static ratpack.groovy.Groovy.*
import groovy.json.JsonSlurper

ratpack {
  handlers {
    get {
      def slurper = new JsonSlurper()
      def result = slurper.parseText('{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}')
      render "Hello world! ${result.person}"
    }
    post("foo") {
      def slurper = new JsonSlurper()
      def result = slurper.parseText("WHAT DO i PUT HERE?")
      render "Hello world! ${result.person}"
    }
  }
}

And an example request:

curl -XPOST -H "Content-Type: application/json" -d '{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}' localhost:5050/foo
Was it helpful?

Solution

Ratpack provides a concept known as a Parser that allows you to parse incoming request body to a given type.

In your case, you could parse incoming request body to a JsonNode, or your own type using the ratpack-jackson module. You can find more information here.

Here is your example using the parser provided by the ratpack-jackson module:

@Grab("io.ratpack:ratpack-groovy:0.9.12")     
@Grab("io.ratpack:ratpack-jackson:0.9.12")    

import static ratpack.groovy.Groovy.*         
import ratpack.jackson.JacksonModule          
import static ratpack.jackson.Jackson.jsonNode

ratpack {                                     
  bindings {                                  
    add new JacksonModule()                   
  }                                           
  handlers {                                  
    post("foo") {                             
      def postBody = parse jsonNode()
      render "Hello world! ${postBody.person}"
    }                                         
  }                                           
}                 

Your curl

curl -XPOST -H "Content-Type: application/json" -d '{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}' localhost:5050/foo

Responds as

Hello world! {"name":"Guillaume","age":33,"pets":["dog","cat"]}

I hope this helps!

OTHER TIPS

The earlier answers are no longer applicable.
Since version 0.9.19, Ratpack returns a Promise. Also, it includes Jackson parsing support. So your example would look like this as of the time of this writing:

context.parse(Jackson.fromJson(Map)).then { data ->
    println data.person
    // do something with person
    context.response.status(201).send()
}

Full docs available here: https://ratpack.io/manual/current/api/ratpack/jackson/Jackson.html#parsing

p.s. One semantic change I made to the example is to return a 201 (created), since it's a POST.

request.body.text would give the string format of the JSON body

post("foo") {
  def slurper = new JsonSlurper()
  def result = slurper.parseText( request.body.text )
  render "Hello world! ${result.person}"
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top