2014-06-30 55 views
3

我有一個耶索德路線有兩個處理器 - 一個用於GET和一個用於PUT:我怎樣才能配置yesod與多個路線指向同一個實體?

getHotspotR :: Key Hotspot -> Handler Value 
getHotspotR i = do 
     hotspot <- runDB $ get404 i 
     returnJson hotspot 

putHotspotR :: Handler() 
putHotspotR = do 
     hotspot <- requireJsonBody 
     hid <- runDB $ insert $ hotspot 
     sendResponseCreated $ HotspotR hid 

但我不知道該怎麼對路由做。如果我這樣做:

/hotspot/#HotspotId HotspotR GET PUT 

它抱怨說,PUT處理程序有錯誤airity:

Couldn't match expected type `Key Hotspot -> HandlerT App IO res0' 
       with actual type `HandlerT App IO()' 
    The function `putHotspotR' is applied to one argument, 
    but its type `Handler()' has none 

但如果我宣佈另一條路線:

/hotspot/#HotspotId HotspotR GET 
/hotspot HotspotR PUT 

它抱怨,我已經得到了重複路線:

/hotspot/#HotspotId HotspotR GET 
/hotspot HotspotR PUT 

Foundation.hs:48:1: 
    Multiple declarations of `HotspotR' 
    Declared at: Foundation.hs:48:1 
       Foundation.hs:48:1 
+0

HTTP PUT必須是[冪(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html),這意味着必須重新執行不會造成重複的項目,這是不是你的情況。如果對新項目使用PUT,則必須在表中爲它們提供相同的DB關鍵字屬性,替換可能存在的關鍵字(如果記錄存在相同的關鍵字,則SQL插入將觸發錯誤)。 –

+0

也使用[Http PUT](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6)URI標識資源。 –

回答

4

從邏輯上講,即使他們操縱實體,這些資源也不盡相同。 HotspotR操縱單個熱點。熱點R操縱熱點集(例如通過插入該集)。

確保路線名稱不同。

/hotspots/   HotspotsR PUT 
/hotspots/#HotspotId HotspotR GET 

然後相應地修改你的put資源。

putHotspotsR :: Handler() 
putHotspotsR = do { ... } 

這將使您可以在將來執行以下操作。

/hotspots/   HotspotsR GET PUT -- list all hotspots, insert a hotspot 
/hotspots/#HotspotId HotspotR GET PATCH -- Get a hotspot, update a hotspot. 
相關問題