Routen mit optionalen Parametern in Suave
Dustinmoris
Ich habe einen Webdienst mit einem Hallo-Welt-Endpunkt wie diesem:
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
Jetzt möchte ich einen zusätzlichen Endpunkt hinzufügen, der Routen wie diese verarbeiten kann: http://localhost:8083/hello/{name}?lang={lang}
Diese Route sollte für die folgenden URLs funktionieren:
- http: // localhost: 8083 / hello / FooBar In diesem Fall sollte lang auf den Standardwert "en-GB" gesetzt werden.
- http: // localhost: 8083 / hello / FooBar? lang = en-GB
- http: // localhost: 8083 / hello / FooBar? lang = de-DE
aber es sollte nicht funktionieren für
http: // localhost: 8083 / hello / FooBar / de-GB
Optionale Parameter sollten nur in einer Abfrageparameterzeichenfolge und nicht im Pfad zulässig sein.
Irgendeine Idee, wie man dies mit Suave erreicht?
Tomas Petricek
Für die Behandlung von Abfrageparametern würde ich wahrscheinlich nur die request
Funktion verwenden, die Ihnen alle Informationen über die ursprüngliche HTTP-Anforderung liefert. Damit können Sie die Abfrageparameter überprüfen:
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" ]