0

我正在为我的 Grails 应用程序开发一个 API,并且正在尝试做一些非 REST 的事情(尽管非常有用)。我正在尝试允许 Show 和 Update 操作接受 ID名称。我的 URLMappings 文件中有以下映射:

"/api/host" (controller:"API", action:"hostList", method:'GET', parseRequest:true)
"/api/host/$id" (controller:"API", action:"hostShow", method:'GET', parseRequest:true)
"/api/host/$id" (controller:"API", action:"hostUpdate", method:'PUT', parseRequest:true)   
"/api/host" (controller:"API", action:"hostCreate", method:'POST', parseRequest:true)

我想要的是让 hostShow 和 hostUpdate 控制器操作接受 ID名称作为 $id。这适用于 Show 操作,但是当我使用 HTTP-PUT 尝试它时,我收到以下错误:

HTTP/1.1 422 Unprocessable Entity
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8   
{"errors":[{"object":"Host","field":"id","rejected-value":"TEST","message":"Property id must be a valid number"}]}

我似乎无法绕过这个错误。我用来尝试执行此操作的 CURL 命令是:

curl -i -X PUT -H "Content-Type:application/json" -d "{name:NEWTEST}", http://localhost:8080/myapp/api/host/TEST

对此的任何反馈或帮助将不胜感激!下面是我的 hostShow 和 hostUpdate 操作的代码:

def hostShow() {
    def hostInstance
    try {
        hostInstance = Host.get(params.id)
    }
    catch(Exception E) {
        hostInstance = Host.findByHostname(params.id)
    }

    if(hostInstance == null)
        respond null, [status: HttpStatus.NOT_FOUND]

    respond hostInstance
}    

@Transactional
def hostUpdate() {
    // Convert incoming JSON to params structure
    request.JSON.each { k,v ->
        params[k] = v
    }    

    // Get by either ID or hostname
    def hostInstance
    try {
        hostInstance = Host.get(params.id)
    }
    catch(Exception E) {
        hostInstance = Host.findByHostname(params.id)
    }

    hostInstance.properties = params   // Set new properties
    hostInstance.save(flush:true)                 

    respond hostInstance, [status: HttpStatus.OK]
}
4

1 回答 1

0

结果是给我错误的代码有问题,而不是 Grails 或 API 机制本身的问题。

问题是,当我设置 hostInstance.properties=params 时,它会尝试将 hostInstance.id 设置为 params.id,在本例中是主机名。我通过添加以下行解决了这个问题:

params.id = hostInstance.id   // <--- This line solves the problem
hostInstance.properties=params

感谢您的反馈,很抱歉提出这样一个简单错误的问题(回想起来)。

于 2014-06-06T22:23:46.407 回答