Building RESTful Web Services
We can expose simple REST web services with the help of the combinator mapJson
. The mapJson
uses the default BCL JSON serializer DataContractJsonSerializer
.
open Suave open Suave.Json open System.Runtime.Serialization [<DataContract>] type Foo = { [<field: DataMember(Name = "foo")>] foo : string } [<DataContract>] type Bar = { [<field: DataMember(Name = "bar")>] bar : string } startWebServer defaultConfig (mapJson (fun (a:Foo) -> { bar = a.foo }))
|
Or you can bring your own JSON serializer like Chiron:https://github.com/xyncro/chiron
type A = { a : int } static member ToJson (x : A) = Json.writer "a" x.a
|
let app = GET >=> path "/test" >=> OK (UTF8.bytes it) >=> setMimeType "application/json; charset=utf-8"
namespace Suave
module Json
from Suave
from Suave
namespace System
namespace System.Runtime
namespace System.Runtime.Serialization
type Foo =
{foo: string;}
Full name: temp.Foo
{foo: string;}
Full name: temp.Foo
Foo.foo: string
Multiple items
val string : value:'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = System.String
Full name: Microsoft.FSharp.Core.string
val string : value:'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = System.String
Full name: Microsoft.FSharp.Core.string
type Bar =
{bar: string;}
Full name: temp.Bar
{bar: string;}
Full name: temp.Bar
Bar.bar: string
val startWebServer : config:SuaveConfig -> webpart:WebPart -> unit
Full name: Suave.Web.startWebServer
Full name: Suave.Web.startWebServer
val defaultConfig : SuaveConfig
Full name: Suave.Web.defaultConfig
Full name: Suave.Web.defaultConfig
val mapJson<'T1,'T2> : (('T1 -> 'T2) -> HttpContext -> Async<HttpContext option>)
Full name: Suave.Json.mapJson
Full name: Suave.Json.mapJson
val a : Foo
type A =
{a: int;}
static member ToJson : x:A -> 'a
Full name: temp.A
{a: int;}
static member ToJson : x:A -> 'a
Full name: temp.A
A.a: int
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
static member A.ToJson : x:A -> 'a
Full name: temp.A.ToJson
Full name: temp.A.ToJson
val x : A
val app : (obj -> Async<obj option>)
Full name: temp.app
Full name: temp.app
union case HttpMethod.GET: HttpMethod
val path : pathAfterDomain:string -> WebPart
Full name: Suave.Filters.path
Full name: Suave.Filters.path
val OK : body:string -> WebPart
Full name: Suave.Successful.OK
Full name: Suave.Successful.OK
module UTF8
from YoLo
from YoLo
val bytes : s:string -> byte []
Full name: YoLo.UTF8.bytes
Full name: YoLo.UTF8.bytes