2012-11-07 14 views
5

Ich möchte eine Anfrage als JSON senden und in meinem Controller möchte ich dieses JSON analysieren und die Parameter, die ich will. Dies ist zum Beispiel die Anfrage:Grails senden Anfrage als JSON und parse es in Controller

{"param1":"val1"} 

Ich möchte diese Anfrage analysieren und "param1" Wert erhalten. Ich habe request.JSON verwendet, aber ich habe immer noch null. Gibt es einen anderen Weg, dies zu lösen?

Danke,

+0

Sie müssen den contentType Ihrer Anfrage auf 'application/json' setzen, damit Ihr Controller den geposteten JSON automatisch parst/unmarshallt. Wie senden Sie Ihre Anfrage? – aiolos

+0

Ich benutze Rest Client firefox extenstion. Wie stelle ich es ein? –

+0

Fügen Sie eine Zeile in Anforderungsheadern hinzu: 'Content-Type' mit dem Wert' application/json'. Ich kann sehen, dass der Rest-Client eine Tabelle namens Request Headers hat - setzen Sie sie dorthin. –

Antwort

2

Set es in Ihrem urlMappings wie folgt aus:

static mappings = { 
    "/rest/myAction" (controller: "myController", action: "myAction", parseRequest: true) 
} 

Suche nach parseRequest in latest Grails guide.

dann überprüfen, ob sie korrekt mit curl funktioniert:

curl --data '{"param1":"value1"}' --header "Content-Type: application/json" http://yourhost:8080/rest/myAction 
+0

Ich habe kein Problem mit Zuordnung. Ich verwende "/ $ Controller/get" (parseRequest: true) { \t \t \t action = [GET: "get"] \t \t} –

+0

@FerasOdeh bitte meine bearbeitete Antwort überprüfen. –

+0

Wie könnte ich JSON als Parameter mit einem beliebigen Rest-Client senden –

0

In der Controller-Methode, überprüfen request.format. Es sollte json angeben. Ich schätze, es wird nicht hier sein, aber es kann Ihnen Hinweise geben, wie Ihre Nutzlast interpretiert wird.

In Ihrer Config.groovy Datei, würde ich die folgenden Werte gesetzt:

grails.mime.file.extensions = false 
grails.mime.use.accept.header = false 

In derselben Datei, Ihre grails.mime.types überprüfen. stellen Sie sicher, dass es json: ['application/json', 'text/json'] enthält, was wahrscheinlich ist, aber setzen Sie es über */*. Diese Einträge werden der Reihe nach ausgewertet (dies war in den Versionen vor Version 2.1 der Fall, nicht bestätigt, es ist jetzt, aber was zum Teufel). In Verbindung damit, wie Aiolos erwähnt, setzen Sie Ihre content-type Header zu einem der oben genannten Mime-Typen.

Schließlich Test mit Curl, nach Tomasz Kalkosiński, oder, um RESTClient für FF zu verwenden, klicken Sie auf "Kopfzeilen" ganz oben auf der Clientseite (es gibt 4 klickbare Elemente oben links; Kopfzeilen sind eins Von einem frischen RESTClient müssen Sie möglicherweise "Benutzerdefinierte Kopfzeile" wählen. Ich kann mich nicht erinnern)

4

Sie können einen der folgenden verwenden, um Ihre Sachen zu testen (beide Optionen könnten später als automatisierte Tests wiederverwendet werden) Einheit und Integration):

einen Komponententest schreiben für Sie die Steuerung wie (keine Notwendigkeit, den Server zu starten):

void testConsume() { 
    request.json = '{param1: "val1"}' 
controller.consume()  
assert response.text == "val1" 
} 

und lassen Sie uns Ihre controller.consume sagen() tut so etwas wie:

def consume() { 
    render request.JSON.param1 
} 

Oder Sie das Jersey-Client zum Beispiel dieses Mal einen Aufruf gegen Ihre Steuerung zu tun, entfaltet verwenden können:

public void testRequest() { 
    // init the client 
    ClientConfig config = new DefaultClientConfig(); 
    Client client = Client.create(config); 

    // create a resource 
WebResource service = client.resource(UriBuilder.fromUri("your request url").build()); 
    // set content type and do a POST, which will accept a text/plain response as well 
    service.type(MediaType.APPLICATION_JSON).accept(MediaType.TEXT_PLAIN).put(Foo.class, foo); 
} 

, wo foo ein foo ist wie folgt:

@XmlRootElement 
public class Foo { 
    @XmlElement(name = "param1") 
    String param1; 

    public Foo(String val){param1 = val;}  
} 

Hier sind einige weitere Beispiele dafür, wie die Jersey-Client für verschiedene REST-Anforderungen verwenden: https://github.com/tavibolog/TodaySoftMag/blob/master/src/test/java/com/todaysoftmag/examples/rest/BookServiceTest.java