Skip to content

Commit 6741f5b

Browse files
committed
add suave server HTTP endpoint
1 parent 0928f29 commit 6741f5b

File tree

3 files changed

+52
-6
lines changed

3 files changed

+52
-6
lines changed

fsharp/HopacSeries/Part3/ApiGateway.fsx

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,15 @@ open FSharp.Data
99
#r "packages/FSharp.Data/lib/net45/FSharp.Data.dll"
1010
#r "packages/Http.fs/lib/net461/HttpFs.dll"
1111
#r "packages/System.Net.Http/lib/net46/System.Net.Http.dll"
12+
#r "packages/Suave/lib/net40/Suave.dll"
1213

1314
open Hopac
1415
open FSharp.Data
1516
open HttpFs.Client
17+
open Suave
18+
open Suave.Successful
19+
open Suave.Filters
20+
open System.Threading
1621

1722
type UserTypeProvider = JsonProvider<"https://api.github.com/users/tamizhvendan">
1823
type User = UserTypeProvider.Root
@@ -144,6 +149,8 @@ type UserDto = {
144149
"avatarUrl", JsonValue.String u.AvatarUrl
145150
"topThreeRepos", topThreeRepos
146151
|]
152+
static member ToJsonString(u : UserDto) =
153+
UserDto.ToJson(u).ToString()
147154

148155
let repoDto (repo : Repo) languages = {
149156
Name = repo.Name
@@ -171,9 +178,45 @@ let getUserDto username = job {
171178
}
172179
}
173180

174-
#time "on"
175-
getUserDto "haf"
176-
|> Job.map (UserDto.ToJson)
177-
|> Job.map (fun x -> x.ToString())
178-
|> run
179-
#time "off"
181+
182+
open Suave.Operators
183+
184+
let getUserApi username ctx = async {
185+
let! userDtoResponse =
186+
getUserDto username
187+
|> Job.catch
188+
|> Job.toAsync
189+
match userDtoResponse with
190+
| Choice1Of2 userDto ->
191+
let res =
192+
userDto
193+
|> UserDto.ToJsonString
194+
|> OK
195+
>=> Writers.setMimeType "application/json; charset=utf-8"
196+
return! res ctx
197+
| Choice2Of2 ex ->
198+
printfn "%A" ex
199+
return! ServerErrors.INTERNAL_ERROR "something went wrong" ctx
200+
}
201+
202+
let app = pathScan "/api/profile/%s" getUserApi
203+
204+
let startServer () =
205+
let cts = new CancellationTokenSource()
206+
let listening, server =
207+
startWebServerAsync defaultConfig app
208+
Async.Start(server, cts.Token) |> ignore
209+
Async.RunSynchronously listening |> ignore
210+
cts
211+
212+
let stopServer (cts : CancellationTokenSource) =
213+
cts.Cancel true
214+
cts.Dispose()
215+
216+
217+
// #time "on"
218+
// getUserDto "haf"
219+
// |> Job.map (UserDto.ToJson)
220+
// |> Job.map (fun x -> x.ToString())
221+
// |> run
222+
// #time "off"

fsharp/HopacSeries/Part3/paket.dependencies

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ framework: net461
33
nuget FSharp.Data
44
nuget Hopac
55
nuget Http.Fs
6+
nuget Suave
67
nuget System.Net.Http

fsharp/HopacSeries/Part3/paket.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ NUGET
88
Http.fs (5.0.1)
99
FSharp.Core (>= 4.1.18)
1010
Hopac (>= 0.3.23)
11+
Suave (2.2.1)
12+
FSharp.Core (>= 4.0.0.1)
1113
System.Net.Http (4.3.3)
1214
System.Security.Cryptography.X509Certificates (>= 4.3)
1315
System.Security.Cryptography.Algorithms (4.3.1)

0 commit comments

Comments
 (0)