Как захватить динамический подпуть, такой как "/ COMPANY / rest ..." с помощью Suave, и вложить маршруты? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть несколько маршрутов, которые должны быть сгруппированы по «компании», плюс некоторые, которые действительны для всех:

/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
    ]

ОднакоPathScan захватывает все URL "/ demo1 / Customers" вместо только "/ demo1".

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Глядя на то, что предлагается в документации Giraffe (похоже на Suave по духу).Они используют pathScan с всеми частями одновременно с именем subroutef

Так что это будет что-то вроде:

pathScan "/%s/customers" queryCustomers
pathScan "/%s/products" queryProducts
...
0 голосов
/ 19 февраля 2019

Если я правильно понимаю:

  • Все общие 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
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...