json - example - spring security oauth2
Problemas con un pedido POST/PUT Json RESTful Grails (1)
Así es como debe hacerse en los controladores:
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()
}
Cliente REST:
¿Cómo está probando el REST WS? ¿Debería tener un cliente REST para probar el servicio? O puede usar la extensión de la consola REST en Chrome para probar su servicio. También puede usar un plugin de grails rest-client-builder para probar su servicio. En términos básicos, si no quiere ninguna implementación de cliente, entonces al menos una secuencia de comandos para probar su servicio. HttpBuilder será útil en este caso: Se requiere algo como esto para probar su servicio
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
}
}
Hola, tengo un código de descanso de Grails. Perfecciono una solicitud de obtención y eliminación de Json. Mi problema es: quiero hacer una solicitud de envío o publicación con json, pero si utilizo un programa para hacerlo, tiene un error y no puedo hacerlo. Aquí mi código: una clase:
package catalogo.json
class Catalogo {
String nombre
String descripcion
String url
Set <Parametros>parametros =[]
static hasMany = [parametros:Parametros]
int numeroParametros = parametros.size()
}
Y otra clase:
package catalogo.json
class Parametros {
String tipoParametro
String json
static constraints = {
tipoParametro(nullable:true)
json(nullable:true)
}
}
No sé cómo poner mi json en la solicitud. Aquí está el error cuando lo puse.
EJEMPLO:
PUSE la solicitud POST. body application/json
(o text/json
es el mismo error) Charset-utf-8
{"descripcion": "bla", "nombre" : "lalala", "numeroParametros":3, "parametros":[{
"tipoParametro":"string", "json":"bla"}],"url":"http://www.google.com"}
Y aquí el error:
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]
EDITAR AQUÍ MI CONTROLADOR:
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
}
}
}
}
Gracias