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 に答える