10

我有一个带有 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}

此路由应适用于以下 URL:

但它不应该适用于

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

可选参数应该只允许在查询参数字符串中而不是在路径中。

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

4

1 回答 1

10

对于处理查询参数,我可能只使用该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" ]
于 2016-04-11T12:55:23.310 回答