私は自分の 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]
}