Response Content Transformations
There are several ways transforming the content of the returned response to something like text or JSON:
See also: Response
http {
POST "https://reqres.in/api/users"
CacheControl "no-cache"
body
json """
{
"name": "morpheus",
"job": "leader"
}
"""
}
|> Request.send
|> Response.toJson
JSON dynamic processing:
http {
GET @"https://reqres.in/api/users?page=2&delay=3"
}
|> Request.send
|> Response.toJson
|> fun json -> json?page.GetInt32()
JsonSerializerOptions / Using Tarmil-FSharp.SystemTextJson
FSharp.SystemTextJson enables JSON (de)serialization of F# types like tuples, DUs and others.
To do so, use the JsonSerializeWith
or one of the Response.toJsonWith
functions and pass
JsonSerializerOptions
. Instead, it's also possible to globally configure the JsonSerializerOptions
that will be used as default for any request where JSON (de)serialization is involved:
#r "nuget: FSharp.SystemTextJson"
// ---------------------------------
// Prepare global JSON configuration
// ---------------------------------
open System.Text.Json
open System.Text.Json.Serialization
FsHttp.GlobalConfig.Json.defaultJsonSerializerOptions <-
let options = JsonSerializerOptions()
options.Converters.Add(JsonFSharpConverter())
options
// -----------------
// ... make requests
// -----------------
type Person = { name: string; age: int; address: string option }
let john = { name ="John"; age = 23; address = Some "whereever" }
http {
POST "loopback body"
body
jsonSerialize john
}
|> Request.send
|> Response.deserializeJson<Person>
|> fun p -> p.address = john.address // true
Download a file
You can easily save the response content as file:
// Downloads the nupkg file as zip
get "https://www.nuget.org/api/v2/package/G-Research.FSharp.Analyzers/0.1.5"
|> Request.send
|> Response.saveFile @"C:\Downloads\analyzers.zip"
namespace FsHttp
Multiple items
static member HttpBuilder.http: HeaderContext
--------------------
property HttpBuilder.http: HeaderContext with get
static member HttpBuilder.http: HeaderContext
--------------------
property HttpBuilder.http: HeaderContext with get
custom operation: POST (string)
Calls IRequestContext.Post
custom operation: CacheControl (string)
Calls IRequestContext.CacheControl
<summary> Used to specify directives that MUST be obeyed by all caching mechanisms along the request/response chain </summary>
<summary> Used to specify directives that MUST be obeyed by all caching mechanisms along the request/response chain </summary>
custom operation: body
Calls IRequestContext.Body
<summary> An explicit transformation from a previous context to allow for describing the request body. </summary>
<summary> An explicit transformation from a previous context to allow for describing the request body. </summary>
custom operation: json (string)
Calls IRequestContext.Json
Multiple items
module Request from FsHttp.Print
--------------------
module Request from FsHttp
--------------------
type Request = { header: Header content: BodyContent config: Config printHint: PrintHint }
module Request from FsHttp.Print
--------------------
module Request from FsHttp
--------------------
type Request = { header: Header content: BodyContent config: Config printHint: PrintHint }
val send: request: IToRequest -> Response
<summary> Sends a request synchronously. </summary>
<summary> Sends a request synchronously. </summary>
Multiple items
module Response from FsHttp.Print
--------------------
module Response from FsHttp
--------------------
type Response = { request: Request requestMessage: HttpRequestMessage content: HttpContent headers: HttpResponseHeaders reasonPhrase: string statusCode: HttpStatusCode version: Version printHint: PrintHint originalHttpRequestMessage: HttpRequestMessage originalHttpResponseMessage: HttpResponseMessage ... } interface IDisposable interface IUpdatePrintHint<Response>
module Response from FsHttp.Print
--------------------
module Response from FsHttp
--------------------
type Response = { request: Request requestMessage: HttpRequestMessage content: HttpContent headers: HttpResponseHeaders reasonPhrase: string statusCode: HttpStatusCode version: Version printHint: PrintHint originalHttpRequestMessage: HttpRequestMessage originalHttpResponseMessage: HttpResponseMessage ... } interface IDisposable interface IUpdatePrintHint<Response>
val toJson: response: Response -> System.Text.Json.JsonElement
custom operation: GET (string)
Calls IRequestContext.Get
val json: System.Text.Json.JsonElement
namespace System
namespace System.Text
namespace System.Text.Json
namespace System.Text.Json.Serialization
module GlobalConfig
from FsHttp
module Json
from FsHttp.GlobalConfig
val mutable defaultJsonSerializerOptions: JsonSerializerOptions
val options: JsonSerializerOptions
Multiple items
type JsonSerializerOptions = new: unit -> unit + 2 overloads member AddContext<'TContext (requires default constructor and 'TContext :> JsonSerializerContext)> : unit -> unit member GetConverter: typeToConvert: Type -> JsonConverter member GetTypeInfo: ``type`` : Type -> JsonTypeInfo member MakeReadOnly: unit -> unit + 1 overload member TryGetTypeInfo: ``type`` : Type * typeInfo: byref<JsonTypeInfo> -> bool member AllowTrailingCommas: bool member Converters: IList<JsonConverter> member DefaultBufferSize: int member DefaultIgnoreCondition: JsonIgnoreCondition ...
<summary>Provides options to be used with <see cref="T:System.Text.Json.JsonSerializer" />.</summary>
--------------------
JsonSerializerOptions() : JsonSerializerOptions
JsonSerializerOptions(defaults: JsonSerializerDefaults) : JsonSerializerOptions
JsonSerializerOptions(options: JsonSerializerOptions) : JsonSerializerOptions
type JsonSerializerOptions = new: unit -> unit + 2 overloads member AddContext<'TContext (requires default constructor and 'TContext :> JsonSerializerContext)> : unit -> unit member GetConverter: typeToConvert: Type -> JsonConverter member GetTypeInfo: ``type`` : Type -> JsonTypeInfo member MakeReadOnly: unit -> unit + 1 overload member TryGetTypeInfo: ``type`` : Type * typeInfo: byref<JsonTypeInfo> -> bool member AllowTrailingCommas: bool member Converters: IList<JsonConverter> member DefaultBufferSize: int member DefaultIgnoreCondition: JsonIgnoreCondition ...
<summary>Provides options to be used with <see cref="T:System.Text.Json.JsonSerializer" />.</summary>
--------------------
JsonSerializerOptions() : JsonSerializerOptions
JsonSerializerOptions(defaults: JsonSerializerDefaults) : JsonSerializerOptions
JsonSerializerOptions(options: JsonSerializerOptions) : JsonSerializerOptions
property JsonSerializerOptions.Converters: System.Collections.Generic.IList<JsonConverter> with get
<summary>Gets the list of user-defined converters that were registered.</summary>
<returns>The list of custom converters.</returns>
<summary>Gets the list of user-defined converters that were registered.</summary>
<returns>The list of custom converters.</returns>
System.Collections.Generic.ICollection.Add(item: JsonConverter) : unit
Multiple items
type JsonFSharpConverter = inherit JsonConverterFactory new: fsOptions: JsonFSharpOptions * [<Optional>] overrides: IDictionary<Type,JsonFSharpOptions> -> JsonFSharpConverter + 2 overloads override CanConvert: typeToConvert: Type -> bool override CreateConverter: typeToConvert: Type * options: JsonSerializerOptions -> JsonConverter member Options: JsonFSharpOptions member Overrides: (JsonFSharpOptions -> IDictionary<Type,JsonFSharpOptions>)
--------------------
type JsonFSharpConverterAttribute = inherit JsonConverterAttribute interface IJsonFSharpConverterAttribute new: fsOptions: JsonFSharpOptions -> JsonFSharpConverterAttribute + 2 overloads override CreateConverter: typeToConvert: Type -> JsonConverter member AllowNullFields: bool with set member BaseUnionEncoding: JsonUnionEncoding with set member IncludeRecordProperties: bool with set member SkippableOptionFields: SkippableOptionFields with set member Types: JsonFSharpTypes with set member UnionAllowUnorderedTag: bool with set ...
--------------------
new: unit -> JsonFSharpConverter
new: fsOptions: JsonFSharpOptions * [<System.Runtime.InteropServices.Optional>] overrides: System.Collections.Generic.IDictionary<System.Type,JsonFSharpOptions> -> JsonFSharpConverter
new: [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonUnionEncoding> (19457) :> obj))>] unionEncoding: JsonUnionEncoding * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Case" :> obj))>] unionTagName: JsonUnionTagName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Fields" :> obj))>] unionFieldsName: JsonUnionFieldsName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((null :> obj))>] unionTagNamingPolicy: JsonNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((null :> obj))>] unionFieldNamingPolicy: JsonNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] unionTagCaseInsensitive: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] allowNullFields: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] includeRecordProperties: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonFSharpTypes> (4095) :> obj))>] types: JsonFSharpTypes * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] allowOverride: bool * [<System.Runtime.InteropServices.Optional>] overrides: System.Collections.Generic.IDictionary<System.Type,JsonFSharpOptions> -> JsonFSharpConverter
--------------------
new: unit -> JsonFSharpConverterAttribute
new: fsOptions: JsonFSharpOptions -> JsonFSharpConverterAttribute
new: [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonUnionEncoding> (19457) ||| enum<JsonUnionEncoding> (-2147483648) :> obj))>] unionEncoding: JsonUnionEncoding * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Case" :> obj))>] unionTagName: JsonUnionTagName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Fields" :> obj))>] unionFieldsName: JsonUnionFieldsName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonKnownNamingPolicy> (0) :> obj))>] unionTagNamingPolicy: JsonKnownNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonKnownNamingPolicy> (0) :> obj))>] unionFieldNamingPolicy: JsonKnownNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] unionTagCaseInsensitive: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] allowNullFields: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] includeRecordProperties: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonFSharpTypes> (4095) :> obj))>] types: JsonFSharpTypes -> JsonFSharpConverterAttribute
type JsonFSharpConverter = inherit JsonConverterFactory new: fsOptions: JsonFSharpOptions * [<Optional>] overrides: IDictionary<Type,JsonFSharpOptions> -> JsonFSharpConverter + 2 overloads override CanConvert: typeToConvert: Type -> bool override CreateConverter: typeToConvert: Type * options: JsonSerializerOptions -> JsonConverter member Options: JsonFSharpOptions member Overrides: (JsonFSharpOptions -> IDictionary<Type,JsonFSharpOptions>)
--------------------
type JsonFSharpConverterAttribute = inherit JsonConverterAttribute interface IJsonFSharpConverterAttribute new: fsOptions: JsonFSharpOptions -> JsonFSharpConverterAttribute + 2 overloads override CreateConverter: typeToConvert: Type -> JsonConverter member AllowNullFields: bool with set member BaseUnionEncoding: JsonUnionEncoding with set member IncludeRecordProperties: bool with set member SkippableOptionFields: SkippableOptionFields with set member Types: JsonFSharpTypes with set member UnionAllowUnorderedTag: bool with set ...
--------------------
new: unit -> JsonFSharpConverter
new: fsOptions: JsonFSharpOptions * [<System.Runtime.InteropServices.Optional>] overrides: System.Collections.Generic.IDictionary<System.Type,JsonFSharpOptions> -> JsonFSharpConverter
new: [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonUnionEncoding> (19457) :> obj))>] unionEncoding: JsonUnionEncoding * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Case" :> obj))>] unionTagName: JsonUnionTagName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Fields" :> obj))>] unionFieldsName: JsonUnionFieldsName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((null :> obj))>] unionTagNamingPolicy: JsonNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((null :> obj))>] unionFieldNamingPolicy: JsonNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] unionTagCaseInsensitive: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] allowNullFields: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] includeRecordProperties: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonFSharpTypes> (4095) :> obj))>] types: JsonFSharpTypes * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] allowOverride: bool * [<System.Runtime.InteropServices.Optional>] overrides: System.Collections.Generic.IDictionary<System.Type,JsonFSharpOptions> -> JsonFSharpConverter
--------------------
new: unit -> JsonFSharpConverterAttribute
new: fsOptions: JsonFSharpOptions -> JsonFSharpConverterAttribute
new: [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonUnionEncoding> (19457) ||| enum<JsonUnionEncoding> (-2147483648) :> obj))>] unionEncoding: JsonUnionEncoding * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Case" :> obj))>] unionTagName: JsonUnionTagName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue (("Fields" :> obj))>] unionFieldsName: JsonUnionFieldsName * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonKnownNamingPolicy> (0) :> obj))>] unionTagNamingPolicy: JsonKnownNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonKnownNamingPolicy> (0) :> obj))>] unionFieldNamingPolicy: JsonKnownNamingPolicy * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] unionTagCaseInsensitive: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] allowNullFields: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((false :> obj))>] includeRecordProperties: bool * [<System.Runtime.InteropServices.Optional; System.Runtime.InteropServices.DefaultParameterValue ((enum<JsonFSharpTypes> (4095) :> obj))>] types: JsonFSharpTypes -> JsonFSharpConverterAttribute
type Person =
{
name: string
age: int
address: string option
}
Multiple items
val string: value: 'T -> string
--------------------
type string = System.String
val string: value: 'T -> string
--------------------
type string = System.String
Multiple items
val int: value: 'T -> int (requires member op_Explicit)
--------------------
type int = int32
--------------------
type int<'Measure> = int
val int: value: 'T -> int (requires member op_Explicit)
--------------------
type int = int32
--------------------
type int<'Measure> = int
type 'T option = Option<'T>
val john: Person
union case Option.Some: Value: 'T -> Option<'T>
custom operation: jsonSerialize ('a)
Calls IRequestContext.JsonSerialize
val deserializeJson: response: Response -> 'a
val p: Person
Person.address: string option
val get: url: string -> HeaderContext
val saveFile: fileName: string -> response: Response -> unit