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 在这种情况下应设置 lang
默认值 "en-GB"
- http://localhost:8083/hello/FooBar?lang=en-GB
- http://localhost:8083/hello/FooBar?lang=de-DE
但它不适用于
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" ]
我有一个带有这样的 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 在这种情况下应设置 lang 默认值 "en-GB"
- http://localhost:8083/hello/FooBar?lang=en-GB
- http://localhost:8083/hello/FooBar?lang=de-DE
但它不适用于
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" ]