自定义路线,但保留一些路线作为自动路线
Custom route, but keep some routes as the automatic ones
我在 CRUD 的基础上添加了一些操作,我想要自定义路由到新的操作。但是,请保持 CRUD 操作具有相同的路径(例如 /ShowPost?postId=[uuid]
instance HasPath PostsController where
-- ...
pathTo ShowPostAction { postId } = "/ShowPost?postId=" ++ tshow postId
instance CanRoute PostsController where
parseRoute' = do
let posts = do
string "/Posts"
optional "/"
endOfInput
pure PostsAction
let showPost = do
string "/ShowPost?postId="
postId <- parseId
optional "/"
endOfInput
pure ShowPostAction { postId }
posts <|> showPosts -- ...
我假设 CanRoute
部分没有正确解析,因为我在导航到 /ShowPost?postId=...
时得到了一个 404 页面
这里的问题是 ?postId=
不是请求路径的一部分,因为它是请求的查询字符串的一部分。
给定像 /ShowPost?postId=abc
这样的请求,那么解析器输入实际上只是 /ShowPost
。 ?postId=abc
只能通过 ?context
变量获得。
您可以尝试这样的操作(未测试):
instance HasPath PostsController where
-- ...
pathTo ShowPostAction { postId } = "/ShowPost?postId=" ++ tshow postId
-- Define the auto route instance
instance AutoRoute PostsController
instance CanRoute PostsController where
parseRoute' = do
let customRoutes = ...
customRoutes <|> (autoRoute @PostsController)
基本上这将首先使用您的 customRoutes
解析器,然后尝试通过 AutoRoute
.
回退到解析器
我在 CRUD 的基础上添加了一些操作,我想要自定义路由到新的操作。但是,请保持 CRUD 操作具有相同的路径(例如 /ShowPost?postId=[uuid]
instance HasPath PostsController where
-- ...
pathTo ShowPostAction { postId } = "/ShowPost?postId=" ++ tshow postId
instance CanRoute PostsController where
parseRoute' = do
let posts = do
string "/Posts"
optional "/"
endOfInput
pure PostsAction
let showPost = do
string "/ShowPost?postId="
postId <- parseId
optional "/"
endOfInput
pure ShowPostAction { postId }
posts <|> showPosts -- ...
我假设 CanRoute
部分没有正确解析,因为我在导航到 /ShowPost?postId=...
这里的问题是 ?postId=
不是请求路径的一部分,因为它是请求的查询字符串的一部分。
给定像 /ShowPost?postId=abc
这样的请求,那么解析器输入实际上只是 /ShowPost
。 ?postId=abc
只能通过 ?context
变量获得。
您可以尝试这样的操作(未测试):
instance HasPath PostsController where
-- ...
pathTo ShowPostAction { postId } = "/ShowPost?postId=" ++ tshow postId
-- Define the auto route instance
instance AutoRoute PostsController
instance CanRoute PostsController where
parseRoute' = do
let customRoutes = ...
customRoutes <|> (autoRoute @PostsController)
基本上这将首先使用您的 customRoutes
解析器,然后尝试通过 AutoRoute
.