2012-11-07 12 views
5

Chcę wysłać żądanie jako JSON iw moim kontrolerze chcę przetworzyć ten JSON i uzyskać żądane parametry. na przykład jest to żądanie:Grails wysyłają żądanie jako JSON i parsują go w kontrolerze

{"param1":"val1"} 

Chcę przeanalizować tę prośbę i uzyskać wartość "param1". Użyłem request.JSON, ale nadal mam zerowy. Czy istnieje inny sposób rozwiązania tego problemu?

Dzięki,

+0

Musisz ustawić contentType swojego żądania na 'application/json', aby kontroler automatycznie analizował/unmarshals wysłanego JSON. Jak wysłać swoją prośbę? – aiolos

+0

Używam rozszerzenia Extreme Fire Clienta. Jak to ustawić? –

+0

Dodaj wiersz w nagłówku żądania: 'Content-Type' z wartością' application/json'. Widzę, że Rest Client ma tabelę o nazwie Request Headers - tam ją umieść. –

Odpowiedz

2

ustawić go w swoim UrlMappings tak:

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

wyszukiwania dla parseRequest w latest Grails guide.

Następnie potwierdzić czy działa poprawnie z curl:

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

Nie mam problemu z mapowaniem. Używam "/ $ controller/Get" (parseRequest: true) { \t \t \t action = [GET: "dostać"] \t \t} –

+0

@FerasOdeh proszę sprawdzić moje edytowane odpowiedź. –

+0

Jak mogę wysłać json jako parametr przy użyciu dowolnego klienta odpoczynku? –

0

W metodzie kontrolera, sprawdź request.format. Należy określić json. Zgaduję, że to nie będzie tutaj, ale może dać ci wskazówki, jak twoja ładunek jest interpretowany.

W pliku Config.groovy, chciałbym ustawić następujące wartości:

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

W tym samym pliku, sprawdź grails.mime.types. upewnij się, że zawiera on json: ['application/json', 'text/json'], co prawdopodobnie spowoduje, ale umieść go powyżej */*. Te wpisy są oceniane w kolejności (było to prawdą w wersjach wcześniejszych 2.1, nie było "zweryfikowano, że jest teraz, ale co do cholery). W związku z tym, jak wspomniano powyżej, ustaw twój nagłówek content-type na jeden z powyższych typów MIME.

Na koniec przetestuj za pomocą podkręcania, za pomocą kalkulatora Tomasz Kalkosiński lub, aby użyć RESTClient dla FF, kliknij "Nagłówki" na samej górze strony klienta (w lewym górnym rogu znajdują się 4 klikalne elementy; nagłówki są jednym Od świeżego RESTClienta może być konieczne wybranie "Custom Header" .Nie pamiętam)

4

Możesz użyć jednego z poniższych, aby przetestować swoje rzeczy (obie opcje mogą być ponownie wykorzystane jako automatyczne testy w końcu - jednostka i integracja):

napisać badanej jednostki dla kontrolera jak ty (bez konieczności uruchamiania serwera):

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

i powiedzmy swoją controller.consume() robi coś takiego:

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

Albo można użyć na przykład klienta Jersey zrobić wezwanie przed kontrolera, wdrożonej ten czas:

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); 
} 

, gdzie foo jest foo tak:

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

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

Oto kilka przykładów, w jaki sposób używać klienta Jersey do różnych wniosków, rekreacyjne: https://github.com/tavibolog/TodaySoftMag/blob/master/src/test/java/com/todaysoftmag/examples/rest/BookServiceTest.java

Powiązane problemy