我有一个带有两个处理程序的yesod路由 - 一个用于GET,一个用于PUT:
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处理程序有错误的空气:
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 :(得分:4)
逻辑上,这些资源并不相同,即使它们操纵实体。 HotspotR操纵一个热点。 HotspotsR操纵热点集(例如通过插入该集合)。
确保路线的名称不同。
/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.