2013-05-29 11 views
8

Ciao Ho un codice di riposo grails. Io perfeziono una richiesta JSON per ottenere ed eliminare. Il mio problema è: Voglio fare una richiesta Put o post con json ma se uso un programma per farlo ha un errore e non posso farlo! Ecco il mio codice: Una classe:Problemi con un POST/PUT JSON Richiesta RESTful Grails

package catalogo.json 
class Catalogo { 
    String nombre 
    String descripcion 
    String url 
    Set <Parametros>parametros =[] 
    static hasMany = [parametros:Parametros] 
    int numeroParametros = parametros.size() 
} 

E altra classe:

package catalogo.json 

class Parametros { 
    String tipoParametro 
    String json 
    static constraints = { 
    tipoParametro(nullable:true) 
    json(nullable:true) 
    } 
} 

non so come mettere il mio JSON nella richiesta. Ecco l'errore quando lo metto.

ESEMPIO:
I POST POST request. corpo application/json (o text/json è lo stesso errore) Set di caratteri UTF-8

{"descripcion": "bla", "nombre" : "lalala", "numeroParametros":3, "parametros":[{     
"tipoParametro":"string", "json":"bla"}],"url":"http://www.google.com"} 

E qui l'errore:

Could not create new Catalogo due to errors: 
grails.validation.ValidationErrors: 3 errors 
Field error in object 'catalogo.json.Catalogo' on field 'descripcion': rejected value [null]; codes [catalogo.json.Catalogo.descripcion.nullable.error.catalogo.json.Catalogo.descripcion,catalogo.json.Catalogo.descripcion.nullable.error.descripcion,catalogo.json.Catalogo.descripcion.nullable.error.java.lang.String,catalogo.json.Catalogo.descripcion.nullable.error,catalogo.descripcion.nullable.error.catalogo.json.Catalogo.descripcion,catalogo.descripcion.nullable.error.descripcion,catalogo.descripcion.nullable.error.java.lang.String,catalogo.descripcion.nullable.error,catalogo.json.Catalogo.descripcion.nullable.catalogo.json.Catalogo.descripcion,catalogo.json.Catalogo.descripcion.nullable.descripcion,catalogo.json.Catalogo.descripcion.nullable.java.lang.String,catalogo.json.Catalogo.descripcion.nullable,catalogo.descripcion.nullable.catalogo.json.Catalogo.descripcion,catalogo.descripcion.nullable.descripcion,catalogo.descripcion.nullable.java.lang.String,catalogo.descripcion.nullable,nullable.catalogo.json.Catalogo.descripcion,nullable.descripcion,nullable.java.lang.String,nullable]; arguments [descripcion,class catalogo.json.Catalogo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo] 
Field error in object 'catalogo.json.Catalogo' on field 'nombre': rejected value [null]; codes [catalogo.json.Catalogo.nombre.nullable.error.catalogo.json.Catalogo.nombre,catalogo.json.Catalogo.nombre.nullable.error.nombre,catalogo.json.Catalogo.nombre.nullable.error.java.lang.String,catalogo.json.Catalogo.nombre.nullable.error,catalogo.nombre.nullable.error.catalogo.json.Catalogo.nombre,catalogo.nombre.nullable.error.nombre,catalogo.nombre.nullable.error.java.lang.String,catalogo.nombre.nullable.error,catalogo.json.Catalogo.nombre.nullable.catalogo.json.Catalogo.nombre,catalogo.json.Catalogo.nombre.nullable.nombre,catalogo.json.Catalogo.nombre.nullable.java.lang.String,catalogo.json.Catalogo.nombre.nullable,catalogo.nombre.nullable.catalogo.json.Catalogo.nombre,catalogo.nombre.nullable.nombre,catalogo.nombre.nullable.java.lang.String,catalogo.nombre.nullable,nullable.catalogo.json.Catalogo.nombre,nullable.nombre,nullable.java.lang.String,nullable]; arguments [nombre,class catalogo.json.Catalogo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo] 
Field error in object 'catalogo.json.Catalogo' on field 'url': rejected value [null]; codes [catalogo.json.Catalogo.url.nullable.error.catalogo.json.Catalogo.url,catalogo.json.Catalogo.url.nullable.error.url,catalogo.json.Catalogo.url.nullable.error.java.lang.String,catalogo.json.Catalogo.url.nullable.error,catalogo.url.nullable.error.catalogo.json.Catalogo.url,catalogo.url.nullable.error.url,catalogo.url.nullable.error.java.lang.String,catalogo.url.nullable.error,catalogo.json.Catalogo.url.nullable.catalogo.json.Catalogo.url,catalogo.json.Catalogo.url.nullable.url,catalogo.json.Catalogo.url.nullable.java.lang.String,catalogo.json.Catalogo.url.nullable,catalogo.url.nullable.catalogo.json.Catalogo.url,catalogo.url.nullable.url,catalogo.url.nullable.java.lang.String,catalogo.url.nullable,nullable.catalogo.json.Catalogo.url,nullable.url,nullable.java.lang.String,nullable]; arguments [url,class catalogo.json.Catalogo]; default message [La propiedad [{0}] de la clase [{1}] no puede ser nulo] 

Modifica qui il mio controller:

package catalogo.json 

import grails.converters.JSON 

class CatalogoController { 

def index = {  
switch(request.method){ 
    case "POST": 
     def catalogo = new Catalogo(params.catalogo) 
     if(catalogo.save()){ 
      response.status = 201 // Created 
      render catalogo as JSON 
     } 
     else{ 
      response.status = 500 //Internal Server Error 
      render "Could not create new Airport due to errors:\n               
         ${catalogo.errors}" 
     } 
     break 
    case "GET": 
    if(params.id){render Catalogo.findById(params.id) as JSON} 
    else{render Catalogo.list() as JSON}   
    break 
case "PUT": 
def catalogo = Catalogo.findById(params.catalogo.id) 
    catalogo.properties = params.catalogo 
    if(catalogo.save()){ 
    response.status = 200 // OK 
    render catalogo as JSON 
    } 
    else{ 
    response.status = 500 //Internal Server Error 
    render "Could not create new Catalogo due to errors:\n ${catalogo.errors}" 
    } 
    break  
    case "DELETE": 
    if(params.id){ 
    def catalogo = Catalogo.findById(params.id) 
    if(catalogo){ 
     catalogo.delete() 
     render "Successfully Deleted." 
    } 
    else{ 
     response.status = 404 //Not Found 
     render "${params.id} not found." 
    } 
    } 
    else{ 
    response.status = 400 //Bad Request 
    render """DELETE request must include the ID code 
       Example: /rest/catalogo/id 
    """ 
    } 
    break 
    } 
} 
    def list = { 
    if(!params.max) params.max = 10 
    def list = Catalogo.list(params) 
    withFormat{ 
    html{ 
     return [catalogoList:list] 
    } 
    json{ 
     render list as JSON 
    } 
    } 
} 
} 

Grazie

+1

Come si salva 'Catalogo' nel controller? – dmahapatro

+0

guarda l'aggiornamento :) grazie! – natijauskas

risposta

18

Ecco come dovrebbe essere fatto nei controllori: -

def index() { 
    //JSON Object is not bound to params it is bound to request in POST/PUT 
    def jsonObj = request.JSON 

    //You can also use JSON.parse() to get a JSON object if the request payload has JSON as string 
    //def jsonObj = JSON.parse(request) 

    //You will not be able to save the inner JSONArrays if you 
    // directly bind the jsonObj to the domain. in order to save 
    //convert them to the proper domain objects otherwise you would get validation  errors for parametros 
    def catalogParams = [] as Set 
    jsonObj.parametros.each{ 
     catalogParams << new CatalogParams(it) 
    } 

    //Set the domain back to the jsonObj 
    jsonObj.parametros = catalogParams 

    //Bind to catalog 
    def catalog = new Catalog(jsonObj) 
    //Synonymous to new Catalog(params) but here you cannot use params. 

    //Save 
    if (!catalog.save(flush: true)){ 
     catalog.errors.each { 
      println it 
     } 
    } 

    render catalog 
} 

//Domain Classes:- 
class CatalogParams { 
    String tipoParametro 
    String json 
    static constraints = { 
     tipoParametro(nullable:true) 
     json(nullable:true) 
    } 
} 

class Catalog { 
    String nombre 
    String descripcion 
    String url 
    Set<CatalogParams> parametros = [] 
    static hasMany = [parametros: CatalogParams] 
    int numeroParametros = parametros.size() 
} 

REST Cliente:

Come stai testando il RIPOSO WS? Dovresti avere un client REST per testare il servizio? Oppure puoi utilizzare REST console extension in Chrome per testare il tuo servizio. Puoi anche utilizzare un plug-in Grails rest-client-builder per testare il tuo servizio. In termini di base, se non si desidera l'implementazione di un client, eseguire almeno uno script per testare il proprio servizio. HttpBuilder sarà utile in questo caso :. Qualcosa di simile è necessario per testare il servizio

import groovyx.net.http.HTTPBuilder 
def http = new HTTPBuilder('http://yourdomain.com/catalog/') 
http.request(POST, JSON) { 
    requestContentType = ContentType.APPLICATION_JSON // coreesponding to application/json 
    body = ["descripcion": "bla", "nombre" : "lalala", "numeroParametros":3, "parametros":[{ "tipoParametro":"string", "json":"bla"}],"url":"google.com"] 

    response.success = { resp -> 
    assert resp.statusLine.statusCode == 200 
    } 
} 
+0

nell'aggiornamento, qui il mio controller. Voglio solo sapere come inserire il json nella request.its non riguardo il codice relativo a questo json per fare la richiesta in un client resful per provarlo. – natijauskas

+0

Qualunque sia il client REST che usi, imposta semplicemente json come 'request.JSON =" il tuo jSON qui "', dovresti essere in grado di accedere al JSON come ho detto nella risposta. – dmahapatro

+0

Ma se metto questa richiesta JSON, ho 505 errori e so perché. Cosa devo cambiare, per favore? {"descripcion": "bla", "nombre": "lalala", "numeroParametros": 3, "parametros": [{ "tipoParametro": "stringa", "json": "bla"}], "url ":" http://www.google.com "} Dove metto request.JSON =" il tuo json qui "???? nel controller? Nel client ?? THANKS – natijauskas