mirror of
https://github.com/Smaug123/WoofWare.Myriad
synced 2025-10-16 17:38:39 +00:00
Use more general serialisation for body params (#72)
This commit is contained in:
@@ -414,6 +414,72 @@ module PureGymApi =
|
|||||||
}
|
}
|
||||||
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||||
|
|
||||||
|
member _.CreateUserSerialisedUrlBody (user : Uri, ct : CancellationToken option) =
|
||||||
|
async {
|
||||||
|
let! ct = Async.CancellationToken
|
||||||
|
|
||||||
|
let uri =
|
||||||
|
System.Uri (
|
||||||
|
(match client.BaseAddress with
|
||||||
|
| null -> System.Uri "https://whatnot.com"
|
||||||
|
| v -> v),
|
||||||
|
System.Uri ("users/new", System.UriKind.Relative)
|
||||||
|
)
|
||||||
|
|
||||||
|
let httpMessage =
|
||||||
|
new System.Net.Http.HttpRequestMessage (
|
||||||
|
Method = System.Net.Http.HttpMethod.Post,
|
||||||
|
RequestUri = uri
|
||||||
|
)
|
||||||
|
|
||||||
|
let queryParams =
|
||||||
|
new System.Net.Http.StringContent (
|
||||||
|
user
|
||||||
|
|> System.Text.Json.Nodes.JsonValue.Create<Uri>
|
||||||
|
|> (fun node -> node.ToJsonString ())
|
||||||
|
)
|
||||||
|
|
||||||
|
do httpMessage.Content <- queryParams
|
||||||
|
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||||
|
let response = response.EnsureSuccessStatusCode ()
|
||||||
|
let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask
|
||||||
|
return responseString
|
||||||
|
}
|
||||||
|
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||||
|
|
||||||
|
member _.CreateUserSerialisedIntBody (user : int, ct : CancellationToken option) =
|
||||||
|
async {
|
||||||
|
let! ct = Async.CancellationToken
|
||||||
|
|
||||||
|
let uri =
|
||||||
|
System.Uri (
|
||||||
|
(match client.BaseAddress with
|
||||||
|
| null -> System.Uri "https://whatnot.com"
|
||||||
|
| v -> v),
|
||||||
|
System.Uri ("users/new", System.UriKind.Relative)
|
||||||
|
)
|
||||||
|
|
||||||
|
let httpMessage =
|
||||||
|
new System.Net.Http.HttpRequestMessage (
|
||||||
|
Method = System.Net.Http.HttpMethod.Post,
|
||||||
|
RequestUri = uri
|
||||||
|
)
|
||||||
|
|
||||||
|
let queryParams =
|
||||||
|
new System.Net.Http.StringContent (
|
||||||
|
user
|
||||||
|
|> System.Text.Json.Nodes.JsonValue.Create<int>
|
||||||
|
|> (fun node -> node.ToJsonString ())
|
||||||
|
)
|
||||||
|
|
||||||
|
do httpMessage.Content <- queryParams
|
||||||
|
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||||
|
let response = response.EnsureSuccessStatusCode ()
|
||||||
|
let! responseString = response.Content.ReadAsStringAsync ct |> Async.AwaitTask
|
||||||
|
return responseString
|
||||||
|
}
|
||||||
|
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||||
|
|
||||||
member _.CreateUserHttpContent (user : System.Net.Http.HttpContent, ct : CancellationToken option) =
|
member _.CreateUserHttpContent (user : System.Net.Http.HttpContent, ct : CancellationToken option) =
|
||||||
async {
|
async {
|
||||||
let! ct = Async.CancellationToken
|
let! ct = Async.CancellationToken
|
||||||
|
@@ -53,6 +53,12 @@ type IPureGymApi =
|
|||||||
[<Post "users/new">]
|
[<Post "users/new">]
|
||||||
abstract CreateUserSerialisedBody : [<Body>] user : PureGym.Member * ?ct : CancellationToken -> Task<string>
|
abstract CreateUserSerialisedBody : [<Body>] user : PureGym.Member * ?ct : CancellationToken -> Task<string>
|
||||||
|
|
||||||
|
[<Post "users/new">]
|
||||||
|
abstract CreateUserSerialisedUrlBody : [<Body>] user : Uri * ?ct : CancellationToken -> Task<string>
|
||||||
|
|
||||||
|
[<Post "users/new">]
|
||||||
|
abstract CreateUserSerialisedIntBody : [<Body>] user : int * ?ct : CancellationToken -> Task<string>
|
||||||
|
|
||||||
[<Post "users/new">]
|
[<Post "users/new">]
|
||||||
abstract CreateUserHttpContent :
|
abstract CreateUserHttpContent :
|
||||||
[<Body>] user : System.Net.Http.HttpContent * ?ct : CancellationToken -> Task<string>
|
[<Body>] user : System.Net.Http.HttpContent * ?ct : CancellationToken -> Task<string>
|
||||||
|
@@ -319,7 +319,6 @@ thereby allowing the programmer to use F#'s record-update syntax.
|
|||||||
|
|
||||||
### Limitations
|
### Limitations
|
||||||
|
|
||||||
* We currently only support interfaces with tupled arguments.
|
|
||||||
* We make the resulting record type at most internal (never public), since this is intended only to be used in tests.
|
* We make the resulting record type at most internal (never public), since this is intended only to be used in tests.
|
||||||
You will therefore need an `AssemblyInfo.fs` file [like the one in WoofWare.Myriad's own tests](./ConsumePlugin/AssemblyInfo.fs).
|
You will therefore need an `AssemblyInfo.fs` file [like the one in WoofWare.Myriad's own tests](./ConsumePlugin/AssemblyInfo.fs).
|
||||||
|
|
||||||
|
@@ -148,3 +148,41 @@ module TestBodyParam =
|
|||||||
|> System.Text.Json.Nodes.JsonNode.Parse
|
|> System.Text.Json.Nodes.JsonNode.Parse
|
||||||
|> PureGym.Member.jsonParse
|
|> PureGym.Member.jsonParse
|
||||||
|> shouldEqual expected
|
|> shouldEqual expected
|
||||||
|
|
||||||
|
[<Test>]
|
||||||
|
let ``Body param of primitive: int`` () =
|
||||||
|
let proc (message : HttpRequestMessage) : HttpResponseMessage Async =
|
||||||
|
async {
|
||||||
|
message.Method |> shouldEqual HttpMethod.Post
|
||||||
|
let! content = message.Content.ReadAsStringAsync () |> Async.AwaitTask
|
||||||
|
let content = new StringContent ("Done! " + content)
|
||||||
|
let resp = new HttpResponseMessage (HttpStatusCode.OK)
|
||||||
|
resp.Content <- content
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
use client = HttpClientMock.make (Uri "https://example.com") proc
|
||||||
|
let api = PureGymApi.make client
|
||||||
|
|
||||||
|
let result = api.CreateUserSerialisedIntBody(3).Result
|
||||||
|
|
||||||
|
result |> shouldEqual "Done! 3"
|
||||||
|
|
||||||
|
[<Test>]
|
||||||
|
let ``Body param of primitive: Uri`` () =
|
||||||
|
let proc (message : HttpRequestMessage) : HttpResponseMessage Async =
|
||||||
|
async {
|
||||||
|
message.Method |> shouldEqual HttpMethod.Post
|
||||||
|
let! content = message.Content.ReadAsStringAsync () |> Async.AwaitTask
|
||||||
|
let content = new StringContent ("Done! " + content)
|
||||||
|
let resp = new HttpResponseMessage (HttpStatusCode.OK)
|
||||||
|
resp.Content <- content
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
use client = HttpClientMock.make (Uri "https://example.com") proc
|
||||||
|
let api = PureGymApi.make client
|
||||||
|
|
||||||
|
let result = api.CreateUserSerialisedUrlBody(Uri "https://mything.com/blah").Result
|
||||||
|
|
||||||
|
result |> shouldEqual "Done! \"https://mything.com/blah\""
|
||||||
|
@@ -481,11 +481,6 @@ module internal HttpClientGenerator =
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
| BodyParamMethods.Serialise ty ->
|
| BodyParamMethods.Serialise ty ->
|
||||||
let typeIdent =
|
|
||||||
match SynType.stripOptionalParen ty with
|
|
||||||
| SynType.LongIdent (SynLongIdent.SynLongIdent (ident, _, _)) -> ident
|
|
||||||
| _ -> failwith $"Unable to identify type %+A{ty}"
|
|
||||||
|
|
||||||
[
|
[
|
||||||
Let (
|
Let (
|
||||||
"queryParams",
|
"queryParams",
|
||||||
@@ -496,11 +491,7 @@ module internal HttpClientGenerator =
|
|||||||
),
|
),
|
||||||
SynExpr.CreateParen (
|
SynExpr.CreateParen (
|
||||||
SynExpr.CreateIdent bodyParamName
|
SynExpr.CreateIdent bodyParamName
|
||||||
|> SynExpr.pipeThroughFunction (
|
|> SynExpr.pipeThroughFunction (JsonSerializeGenerator.serializeNode ty)
|
||||||
SynExpr.CreateLongIdent (
|
|
||||||
SynLongIdent.CreateFromLongIdent (typeIdent @ [ Ident.Create "toJsonNode" ])
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|> SynExpr.pipeThroughFunction (
|
|> SynExpr.pipeThroughFunction (
|
||||||
SynExpr.createLambda
|
SynExpr.createLambda
|
||||||
"node"
|
"node"
|
||||||
|
Reference in New Issue
Block a user