【问题标题】:Problems with a POST/PUT Json RESTful request GrailsPOST/PUT Json RESTful 请求的问题 Grails
【发布时间】:2013-05-25 08:43:18
【问题描述】:

您好,我有一个 grails restful 代码。我确实完善了 Json 获取和删除请求。 我的问题是: 我想用 json 做一个 Put 或 post 请求,但是如果我使用一个程序来做它有一个错误,我做不到! 这是我的代码: 一节课:

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

和其他类:

package catalogo.json

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

我不知道如何将我的 json 放入请求中。这是我放的时候的错误。

示例:
我提出 POST 请求。 正文application/json(或text/json是同样的错误)Charset-utf-8

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

这里是错误:

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]

在这里编辑我的控制器:

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

谢谢

【问题讨论】:

  • 如何在控制器中保存Catalogo
  • 观看更新 :) 谢谢!

标签: json grails post request put


【解决方案1】:

这是在控制器中应该如何完成的:-

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 客户端:

您如何测试 REST WS?您应该有一个 REST 客户端来测试服务吗?或者您可以使用REST console extension in Chrome 来测试您的服务。您还可以使用 grails 插件 rest-client-builder 来测试您的服务。基本上,如果您不想要任何客户端实现,那么至少有一个脚本来测试您的服务。 HttpBuilder 在这种情况下会很有用:。测试您的服务需要这样的东西

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

【讨论】:

  • 在更新中,这里是我的控制器。我只想知道如何将 json 放入请求中。这与关于此 json 的代码无关,以便在 resful 客户端中执行请求以尝试它.
  • 无论您使用哪个REST客户端,只要将json设置为request.JSON = "your json here",您应该可以按照我在答案中提到的方式访问JSON。
  • 但是如果我提出这个 JSON 请求,我会遇到 505 错误,我知道为什么。请问我需要改变什么? {“描述”:“bla”,“名词”:“lalala”,“numeroParametros”:3,“parametros”:[{“tipoParametro”:“字符串”,“json”:“bla”}],“url” :"google.com"} 我把 request.JSON="your json here" 放在哪里????在控制器中?在客户端中??谢谢
  • 查看我的更新,并访问我添加的所有链接以了解如何测试 RESTful 服务。
  • @natijauskas 很高兴我能帮上忙。
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多