2016-04-11 2 views
8

У меня есть веб-сервис с привет мир конечной точки, как это:Маршруты с необязательными параметрами в 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 

Теперь я хотел бы добавить дополнительную конечную точку, которая может обрабатывать маршруты, как это: http://localhost:8083/hello/{name}?lang={lang}

Этот маршрут должен работать по следующим адресам:

, но он не должен работать на

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

Дополнительные параметры должны быть разрешены только в запросе строка параметров, а не путь.

Любая идея, как достичь этого с помощью Suave?

ответ

9

Для обработки параметров запроса я бы просто использовал функцию 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" ] 
+1

Прохладный, спасибо. Я не был уверен, был ли более простой встроенный способ сделать это с Suave или мне пришлось самостоятельно обрабатывать необязательный параметр. Было бы неплохо в какой-то момент настроить значения по умолчанию и необязательные параметры как часть регистрации маршрута каким-то образом, но на данный момент это делает работу! – dustinmoris