6

次の形式の単純な Suave.io サーバーがあります。

let Ok o = o |> JsonConvert.SerializeObject |> Successful.OK
let NotOk o = o |> JsonConvert.SerializeObject |> RequestErrors.BAD_REQUEST

type Result<'T> =
| Success of 'T
| Failure of string

let DoThing someParam anotherParam =
    let stats = Success(999) // <- business code here
    match stats with
    | Success s -> s |> Ok
    | Failure m -> m |> NotOk
...
        let app =
            choose
                [ GET >=> choose
                    [
                        pathScan "/someroute/%i/%i" (fun (p1, p2) -> 
                                DoThing p1 p2)
                    ] 
                ]
        startWebServer config app
        0

リクエストに特定の名前と値のヘッダーが含まれていることを確認し、存在しないか正しくない場合は NotOk を返したいと思います。これを達成する最も簡単な方法は何ですか?

私は Suave.io の構成スタイルの初心者です。

4

1 に答える 1

4

私はこれがあなたが必要とすることをするだろうと思います:

#r "Newtonsoft.Json.dll"
#r "Suave.dll"
#r "Suave.Testing.dll"
#r "System.Net.Http.dll"
#r "Fuchu.dll"

open System.Net
open System.Net.Http

open Suave
open Suave.Operators
open Newtonsoft.Json
open Suave.Filters
open Suave.Testing

let Ok o = o |> JsonConvert.SerializeObject |> Successful.OK
let NotOk o = o |> JsonConvert.SerializeObject |> RequestErrors.BAD_REQUEST

type Result<'T> =
| Success of 'T
| Failure of string

let DoThing someParam anotherParam =
    let stats = Success(999) // <- business code here
    match stats with
    | Success s -> s |> Ok
    | Failure m -> m |> NotOk

let checkHeader ctx =
    asyncOption {
        match "key" |> ctx.request.header with
        | Choice1Of2 k1 ->
            printfn "Header k1: %s" k1
            return ctx
        | Choice2Of2 k2 ->
            printfn "Header k2: %s" k2
            return { ctx with
                        response = { ctx.response with
                                        status = HTTP_400 } } }

let app =
    choose
        [ GET >=> choose
            [
                pathScan "/someroute/%i/%i" (fun (p1, p2) ->
                        DoThing p1 p2)
                >=> checkHeader
            ]
        ]

let emptyCont = new ByteArrayContent([||]) |> Some

runWith defaultConfig app
|> reqResp HttpMethod.GET 
           "/someroute/1/2" "" 
           None 
           None 
           DecompressionMethods.None
           id
           id

このスクリプトと同じディレクトリに必要なライブラリがあり、実行できることを確認してください。keyヘッダーがないため、結果はBAD_REQUESTwith content 999 になります。

checkHeader がそのトリックを行います。

于 2016-07-01T17:36:17.870 に答える