2014-06-04 39 views
0

我正在爲我的Grails應用程序的API,我試圖做一些事情有點非REST(雖然非常有用)。我試圖讓顯示和更新操作,以接受ID 名。我在我的URLMappings文件以下映射:Grails的API更新(PUT)沒有ID

"/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。這是工作的罰款與顯示的動作,但是當我的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動作的代碼:它原來是與該是給我的錯誤,而不是一個與Grails的問題或API機制本身的代碼問題

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] 
} 
+1

*試圖做一些事情有點非REST * - 爲什麼? – dmahapatro

+0

因爲ID是內部的應用程序,而不是使用那些誰將會借力API。我們需要讓API對對象名稱進行操作。 – Nisrak

回答

0

問題是,當我設置hostInstance.properties = params時,它會嘗試將hostInstance.id設置爲params.id,在這種情況下,它是主機名。我解決了這個被添加一行:

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

感謝您的反饋和對不起,問一個問題,這樣一個簡單的錯誤(回想起來)。