psf*_*aki 7 f# f#-giraffe saturn-framework
假设我们有这个 Web 服务器来处理请求:
let webApp = scope {
get "/api/zoo/animals/" (getAllAnimals())
getf "/api/zoo/animals/%s" getAnimalInfo
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想在 url 查询中有一个参数,例如过滤结果,该怎么办?
http://localhost:8080/api/zoo/animals?type=mammals
Run Code Online (Sandbox Code Playgroud)
这不会做任何事情:
getf "/api/zoo/animals?type=%s" getAnimalsByType
Run Code Online (Sandbox Code Playgroud)
请参阅此处的示例:
https://github.com/giraffe-fsharp/Giraffe/blob/master/DOCUMENTATION.md#query-strings
它显示了如何从查询字符串绑定数据,这样您就不必使用 GetQueryStringValue
在你的情况下,我认为这样的事情可能会奏效。
[<CLIMutable>]
type AnimalType =
{ type : string }
let animal (next : HttpFunc) (ctx : HttpContext) =
// Binds the query string to a Car object
let animal = ctx.BindQueryString<AnimalType>()
// Sends the object back to the client
Successful.OK animal next ctx
let web_app =
router {
pipe_through (pipeline { set_header "x-pipeline-type" "Api" })
post "/api/animal" animal
}
Run Code Online (Sandbox Code Playgroud)
一种方法是使用GetQueryStringValue上下文的功能。它返回Result,一个结构体 DU。
所以你保持初始签名(只需删除尾部斜杠):
get "/api/zoo/animals" (getAnimals())
Run Code Online (Sandbox Code Playgroud)
你有
let getAnimals() : HttpHandler =
fun _ ctx -> task {
let animalTypeFromQuery = ctx.GetQueryStringValue "type"
let animalType =
match animalTypeFromQuery with
| Ok t -> Some t
| Error _ -> None
...
}
Run Code Online (Sandbox Code Playgroud)
不知道这是不是官方的做法,我在一些F# github repos中找到了这种做法。