WoofWare.Whippet.Plugin.HttpClient
0.1.3
See the version list below for details.
dotnet add package WoofWare.Whippet.Plugin.HttpClient --version 0.1.3
NuGet\Install-Package WoofWare.Whippet.Plugin.HttpClient -Version 0.1.3
<PackageReference Include="WoofWare.Whippet.Plugin.HttpClient" Version="0.1.3"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add WoofWare.Whippet.Plugin.HttpClient --version 0.1.3
#r "nuget: WoofWare.Whippet.Plugin.HttpClient, 0.1.3"
// Install WoofWare.Whippet.Plugin.HttpClient as a Cake Addin #addin nuget:?package=WoofWare.Whippet.Plugin.HttpClient&version=0.1.3 // Install WoofWare.Whippet.Plugin.HttpClient as a Cake Tool #tool nuget:?package=WoofWare.Whippet.Plugin.HttpClient&version=0.1.3
WoofWare.Whippet.Plugin.HttpClient
This is a Whippet plugin for defining RestEase-style HTTP clients.
It is a copy of the corresponding Myriad HttpClient plugin in WoofWare.Myriad, taken from commit d59ebdfccb87a06579fb99008a15f58ea8be394e.
Usage
Define a file like Client.fs
:
open System.Threading.Tasks
open WoofWare.Whippet.Plugin.HttpClient
[<HttpClient>]
type IPureGymApi =
[<Get "v1/gyms/">]
abstract GetGyms : ?ct : CancellationToken -> Task<Gym list>
[<Get "v1/gyms/{gym_id}/attendance">]
abstract GetGymAttendance : [<Path "gym_id">] gymId : int * ?ct : CancellationToken -> Task<GymAttendance>
[<Get "v1/member">]
abstract GetMember : ?ct : CancellationToken -> Task<Member>
[<Get "v1/gyms/{gym_id}">]
abstract GetGym : [<Path "gym_id">] gymId : int * ?ct : CancellationToken -> Task<Gym>
[<Get "v1/member/activity">]
abstract GetMemberActivity : ?ct : CancellationToken -> Task<MemberActivityDto>
[<Get "v2/gymSessions/member">]
abstract GetSessions :
[<Query>] fromDate : DateTime * [<Query>] toDate : DateTime * ?ct : CancellationToken -> Task<Sessions>
In your fsproj:
<Project>
<ItemGroup>
<Compile Include="Client.fs" />
<Compile Include="GeneratedClient.fs">
<WhippetFile>Client.fs</WhippetFile>
</Compile>
</ItemGroup>
<ItemGroup>
<PackageReference Include="WoofWare.Whippet.Plugin.HttpClient.Attributes" Version="" />
<PackageReference Include="WoofWare.Whippet.Plugin.HttpClient" WhippetPlugin="true" Version="" />
<PackageReference Include="WoofWare.Whippet" Version="" PrivateAssets="all" />
</ItemGroup>
</Project>
The generator produces a type like this (here I'm showing the isExtensionMethod = false
version):
/// Module for constructing a REST client.
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
[<RequireQualifiedAccess>]
module PureGymApi =
/// Create a REST client.
let make (client : System.Net.Http.HttpClient) : IPureGymApi =
{ new IPureGymApi with
member _.GetGyms (ct : CancellationToken option) =
async {
let! ct = Async.CancellationToken
let httpMessage =
new System.Net.Http.HttpRequestMessage (
Method = System.Net.Http.HttpMethod.Get,
RequestUri = System.Uri (client.BaseAddress.ToString () + "v1/gyms/")
)
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
let response = response.EnsureSuccessStatusCode ()
let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask
let! node =
System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct)
|> Async.AwaitTask
return node.AsArray () |> Seq.map (fun elt -> Gym.jsonParse elt) |> List.ofSeq
}
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
// (more methods here)
}
You tell the generator to generate a client using the [<HttpClient>]
attribute.
You may instead choose to define an attribute with the correct name yourself (if you don't want to take a dependency on the WoofWare.Whippet.Plugin.RestEase.Attributes
package),
and use the RestEase attributes directly from RestEase by taking a dependency on RestEase.
Alternatively, you may omit the [<HttpClient>]
attribute entirely, and control the generator through the fsproj file:
<Project>
<ItemGroup>
<Compile Include="Client.fs" />
<Compile Include="GeneratedClient.fs">
<WhippetFile>Client.fs</WhippetFile>
<WhippetParamClientType1>HttpClient</WhippetParamClientType1>
<WhippetParamClientType2>HttpClient(false)</WhippetParamClientType2>
</Compile>
</ItemGroup>
<ItemGroup>
<PackageReference Include="WoofWare.Whippet.Plugin.HttpClient" WhippetPlugin="true" Version="" />
<PackageReference Include="WoofWare.Whippet" Version="" PrivateAssets="all" />
</ItemGroup>
</Project>
(This plugin follows a standard convention taken by WoofWare.Whippet.Plugin
plugins,
where you use Whippet parameters with the same name as each input type,
whose contents are a !
-delimited list of the generators which you wish to apply to that input type.)
Notes
- The plugin assumes access to the
WoofWare.Whippet.Plugin.Json
generators in some situations. If you find the result does not compile due to the lack of.jsonParse
methods, you might want to generate them using that plugin. - Supply the optional boolean arg
false
to the[<HttpClient>]
attribute, or pass it via<WhippetParamMyType>HttpClient(false)</WhippetParamMyType>
, to get a genuine module that can be consumed from C# (rather than an extension method).
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- FSharp.Core (>= 8.0.400)
- WoofWare.Whippet.Core (>= 0.1.2)
- WoofWare.Whippet.Fantomas (>= 0.3.1)
- WoofWare.Whippet.Plugin.HttpClient.Attributes (>= 0.1.2)
- WoofWare.Whippet.Plugin.Json (>= 0.1.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.