2016-06-30 25 views
4

我有形式简单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缺失或不正确时返回NotOk。达到此目的最简单的方法是什么?

我是Suave.io的作曲风格的新人。

+0

你可以看看:http://stackoverflow.com/questions/31672110/suave-io-using-pathscan-and-request-together。我认为你可以检查这个请求。注意:'type WebPart = HttpContext - > Async '和'type HttpContext = {request:HttpRequest;响应:HttpResponse}'。所以你需要打开'WebPart'。 – halcwb

回答

3

我认为这会做你需要的东西:

#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_REQUEST,其内容为999.

checkHeader会执行此操作。

+0

谢谢你这么多! – Kit

相关问题