Suave 中带有可选参数的路由

Routes with optional parameters in Suave

我有一个带有这样的 hello world 端点的 Web 服务:

let app =
  choose [ 
      GET >=> 
        choose [ 
          path "/hello" >=> OK "Hello World!"
          pathScan "/hello/%s" (fun name -> OK (sprintf "Hello World from %s" name)) ]
      NOT_FOUND "Not found" ]

[<EntryPoint>]
let main argv = 
  startWebServer defaultConfig app
  0

现在我想添加一个额外的端点来处理这样的路由: http://localhost:8083/hello/{name}?lang={lang}

此路由适用于以下网址:

但它不适用于

http://localhost:8083/hello/FooBar/en-GB

可选参数只能出现在查询参数字符串中,而不能出现在路径中。

知道如何使用 Suave 实现这一点吗?

为了处理查询参数,我可能只使用 request 函数,它会为您提供有关原始 HTTP 请求的所有信息。您可以使用它来检查查询参数:

let handleHello name = request (fun r ->
  let lang = 
    match r.queryParam "lang" with
    | Choice1Of2 lang -> lang
    | _ -> "en-GB"
  OK (sprintf "Hello from %s in language %s" name lang)) 

let app =
  choose [ 
      GET >=> 
        choose [ 
          path "/hello" >=> OK "Hello World!"
          pathScan "/hello/%s" handleHello ]
      NOT_FOUND "Not found" ]