2013-05-29 36 views
8

Xin chào, tôi có một mã grails an toàn. Tôi làm hoàn hảo một Json nhận và xóa yêu cầu. Vấn đề của tôi là: Tôi muốn thực hiện yêu cầu Đặt hoặc gửi với json nhưng nếu tôi sử dụng chương trình để thực hiện điều đó Có lỗi và tôi không thể làm được! Ở đây mã của tôi: Một lớp:Các vấn đề với yêu cầu RESTY POST/PUT Json Grails

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

Và lớp khác:

package catalogo.json 

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

Tôi không biết làm thế nào để đưa json của tôi trong yêu cầu. Heres lỗi khi tôi đặt nó.

VÍ DỤ:
I PUT yêu cầu POST. cơ thể application/json (hoặc text/json là lỗi tương tự) Charset-utf-8

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

Và đây là lỗi:

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] 

EDIT ĐÂY CONTROLLER TÔI:

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

Cảm ơn

+1

Bạn đang lưu 'Catalogo' trong bộ điều khiển như thế nào? – dmahapatro

+0

xem bản cập nhật :) cảm ơn! – natijauskas

Trả lời

18

Dưới đây là cách thực hiện trong bộ điều khiển: -

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 của Chủ đầu tư:

How are you thử nghiệm REST WS? Bạn nên có một máy khách REST để kiểm tra dịch vụ? Hoặc bạn có thể sử dụng REST console extension in Chrome để kiểm tra dịch vụ của mình. Bạn cũng có thể sử dụng plugin grails rest-client-builder để kiểm tra dịch vụ của mình. Theo thuật ngữ cơ bản, nếu bạn không muốn thực hiện bất kỳ ứng dụng khách nào, thì ít nhất một tập lệnh để kiểm tra dịch vụ của bạn. HttpBuilder sẽ hữu ích trong trường hợp này: Yêu cầu một số thông tin như thế này để kiểm tra dịch vụ của bạn

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

trong bản cập nhật, ở đây controller.I của tôi chỉ muốn biết làm thế nào để đưa các json trong request.its không về mã của nó về json này để làm các yêu cầu trong một khách hàng resful để thử nó. – natijauskas

+0

Cho dù khách hàng REST nào bạn sử dụng, chỉ cần đặt json là 'request.JSON =" json của bạn ở đây ", bạn sẽ có thể truy cập JSON theo cách tôi đã đề cập trong câu trả lời. – dmahapatro

+0

Nhưng nếu tôi đặt yêu cầu JSON này, tôi có lỗi 505 và tôi biết tại sao.Điều gì tôi phải thay đổi, vui lòng? {"descripcion": "bla", "nombre": "lalala", "numeroParametros": 3, "parametros": [{ "tipoParametro": "chuỗi", "json": "bla"}], "url ":" http://www.google.com "} Nơi tôi đặt request.JSON =" json của bạn ở đây "???? Trong máy khách? THANKS – natijauskas

Các vấn đề liên quan