2013-05-29 8 views
8

Merhaba Bir grants huzurlu bir kod var. Bir Json alma ve silme isteğini mükemmel yaparım. Benim sorunum: json ile bir Put veya post isteği yapmak istiyorum ama bunu yapmak için bir program kullanırsam, bir hata vardır ve bunu yapamam! İşte benim kod : Bir sınıfı:POST/PUT Json RESTful isteği ile ilgili sorunlar Grails

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

Diğeri sınıfı:

package catalogo.json 

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

Ben istekte benim json koymak nasıl bilmiyorum. Onu koyduğumda hata yapar.

Örnek:
I POST talebi PUT. Burada gövde application/json (veya text/json aynı hatadır) Karakter Kümesi-utf-8

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

Ve hatası:

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] 

DÜZENLEME BURAYA MY KONTROL:

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

Teşekkür

+1

Catalogo nasıl denetleyiciye kaydediliyor? – dmahapatro

+0

güncellemeyi izleyin :) teşekkürler! Güncellemede – natijauskas

cevap

18

Kontrolörlerde nasıl yapılması gerektiği: -

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

DİNLENME Müşteri:

nasıl DİNLENME WS test ediyoruz? Servisi test etmek için bir REST istemcisine sahip olmalısınız? Veya hizmetinizi sınamak için REST console extension in Chrome'u kullanabilirsiniz. Hizmetinizi test etmek için rest-client-builder numaralı notu da kullanabilirsiniz. Temel şartlarda, herhangi bir istemci uygulaması istemiyorsanız, servisinizi test etmek için bir betik atleast. Bu durumda HttpBuilder yararlı olacaktır: Bunun gibi bir şey yapmak için hizmet gereklidir.

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

, burada benim controller.I sadece json koymak request.its hakkında bilmek istemek için bu json hakkında bir javascript istemcinin isteği yapmak için bu json hakkında değil. – natijauskas

+0

Hangi REST istemcisini kullanırsanız kullanın, json'u 'request.JSON =" jsonunuz "olarak ayarlayın, JSON'a cevabımda bahsettiğim şekilde erişebilmeniz gerekir. – dmahapatro

+0

Ama bu JSON isteğini koyarsam 505 hatasım var ve nedenini biliyorum. Ne değişmeliyim, lütfen? {"descripcion": "bla", "nombre": "lalala", "numeroParametros": 3, "parametros": [{ "tipoParametro": "string", "json": "bla"}], "url ":" http://www.google.com "} İstediğim yeri request.JSON =" jsonun burada "???? denetleyicide? İstemcideki ?? THANKS – natijauskas