2014-05-13 14 views
5

Uruchomiłem małą aplikację ratpack w konsoli Groovy, ale nie mogłem wyłapać z dokumentacji, jak uzyskać dane json, które zostały wysłane w żądaniu.Parsowanie jsona w Ratpack Groovy

@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}" 
    } 
    } 
} 

i przykład wniosek:

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

Odpowiedz

9

Ratpack zapewnia koncepcję znaną jako Parser który pozwala analizować przychodzące Żądaj ciała do określonego typu.

W twoim przypadku możesz przeanalizować przychodzące żądanie do JsonNode lub swojego własnego typu przy użyciu modułu ratpack-jackson. Możesz znaleźć więcej informacji here.

Oto Twój przykład za pomocą parsera dostarczonego przez moduł ratpack-jackson:

@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}" 
    }           
    }           
}     

Twój curl

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

reaguje

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

Mam nadzieję, że to pomaga!

2

request.body.text dałoby format string ciała JSON

post("foo") { 
    def slurper = new JsonSlurper() 
    def result = slurper.parseText(request.body.text) 
    render "Hello world! ${result.person}" 
} 
+0

Spojrzałem na opakowanie szczurów, ponieważ wygląda na to, że może być świetną platformą do odpoczynku. Zważywszy na to, jaki byłby idiomatyczny sposób radzenia sobie z opublikowanymi danymi json w groovy? Robiąc to, co zrobiłem? – shmish111

+0

zależy od implementacji. Tutaj użyłeś JsonSlurper do parsowania ładunku JSON, który można również wykonać za pomocą Gson lub dowolnej innej biblioteki JSON. W tym przypadku jest to całkowicie w porządku, jeśli chodzi o sposób, w jaki kończy się mapą ładunku. Rzuć okiem na [Ratpack API] (http://www.ratpack.io/manual/current/api/) głównie pakiet 'ratpack.jackson', jeśli będzie przydatny. @ shmish111 – dmahapatro

3

Wcześniejsze odpowiedzi nie mają już zastosowania.
Od wersji 0.9.19 Ratpack zwraca Obietnicę. Zawiera również obsługę analizowania Jacksona. Więc Przykładem może wyglądać tak, jak w chwili pisania tego tekstu:

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

Pełne docs dostępne tutaj: https://ratpack.io/manual/current/api/ratpack/jackson/Jackson.html#parsing

PS: Jedną z semantycznych zmian, które wprowadziłem do przykładu, jest zwrócenie 201 (utworzonego), ponieważ jest to POST.