2016-04-11 19 views
8

Ho un servizio web con un endpoint ciao mondo come questo:Percorsi con i parametri facoltativi a Suave

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 

Ora vorrei aggiungere un endpoint aggiuntivo in grado di gestire le rotte in questo modo: http://localhost:8083/hello/{name}?lang={lang}

questo percorso dovrebbe funzionare per i seguenti URL:

ma non dovrebbe funzionare per

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

Parametri opzionali dovrebbe essere consentito solo in una query stringa di parametri e non nel percorso.

Qualche idea su come ottenere questo risultato con Suave?

risposta

9

Per la gestione dei parametri di query, probabilmente utilizzerò la funzione request, che fornisce tutte le informazioni sulla richiesta HTTP originale. È possibile utilizzarlo per verificare i parametri della query:

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" ] 
+1

Cool, grazie. Non ero sicuro se ci fosse un modo più semplice di farlo con Suave o se dovessi gestire personalmente il parametro opzionale. Sarebbe bello a un certo punto configurare i valori predefiniti ei parametri facoltativi come parte della registrazione del percorso in qualche modo, ma per ora questo fa il lavoro! – dustinmoris

Problemi correlati