我有几个必须由"公司"分组的路线,还有一些对所有有效的路线:
/login
/logout
/demo1/customers
/demo1/products
所以我尝试使用Suave:
let doReqScan action =
warbler (fun r ->
LOG.Debug("ROUTE: {route}", r.request.url)
match r.request |> getCompany with
| Some(x) ->
let isAuth, validDb = isValidDb(x)
if validDb then
if isAuth then
action(r.request) |> _DoSet
else
jSonNoAuth
else
never
| _ -> never
)
let doReq(route:string, action) =
path route >=> doReqScan action
let appCompany company =
choose [
path "/ws" >=> handShake ws
GET >=> choose
[
doReq("/customers", (fun r -> queryCustomers(r)))
pathScan "/customers/%d" (fun the_id -> doReqScan (fun r -> queryCustomer(r, the_id)))
]
]
let app =
choose
[ allow_cors
pathScan "/%s" (fun company ->
choose
[
appCompany company
GET >=> choose
[
_doReq( "/config", (fun r -> config(r)) )
]
POST >=> choose
[
_doReq( "/login", (fun r -> login(r)))
_doReq( "/logout", (fun r -> logout(r)))
]
]
)
GET >=> Files.browseHome
jSonNotFound
]
但是,路径范围捕获了所有URL"/demo1/usteruster",而不仅仅是"/demo1"。
如果我正确理解:
- 所有常见的URL均处于形式:
/something
- 所有公司URL的形式:
/companyName/something
然后您可以尝试以下操作:
let appCompany company =
let com x = "/" + company + x
choose [
path (com "/ws") >=> handShake ws
GET >=> choose [
doReq(com "/customers", (fun r -> queryCustomers(r)))
pathScan "/%s/customers/%d" (fun _ the_id -> doReqScan (fun r -> queryCustomer(r, the_id)))
]
]
let app =
choose [
allow_cors
GET >=> choose [
_doReq( "/config", (fun r -> config(r)) )
]
POST >=> choose [
_doReq( "/login", (fun r -> login(r)))
_doReq( "/logout", (fun r -> logout(r)))
]
pathScan "/%s/%s" (fun company _ -> appCompany company)
GET >=> Files.browseHome
jSonNotFound
]
查看长颈鹿文档中提出的内容(类似于精神上的Suave)。他们使用所有零件的路径范围 nasure subroutef
所以它会像:
pathScan "/%s/customers" queryCustomers
pathScan "/%s/products" queryProducts
...