Repository F# setup
open System
open System.Net.Http
open System.Threading
open System.Threading.Tasks
open Axial
open Axial.HttpClient
open Axial.PlatformServiceResponses And Errors
The Response Transcript
Every exchange produces a complete HttpResponse. The examples on this page run against a scripted service that
replies with fixed statuses and bodies:
Show page setup
// Setup for the checked examples on this page.
open System
open Axial
open Axial.HttpClient
/// Fails the docs test when an example's result differs from the value shown.
let shouldEqual expected actual =
if actual <> expected then failwithf "Expected %A but got %A" expected actualopen Axial.HttpClient.DSL
type User = { Id: int; Name: string }
type TestEnv =
{ Http: IHttp }
interface IHasHttp with
member this.Http = this.Http
/// A hand-written decoder for {"id":1,"name":"Ada"}; a JSON library's decoder fits the same signature.
let decodeUser (json: string) : Result<User, string> =
let found = Text.RegularExpressions.Regex.Match(json, """^\{"id":(\d+),"name":"([^"]*)"\}$""")
if found.Success then Ok { Id = int found.Groups[1].Value; Name = found.Groups[2].Value }
else Error $"not a user: {json}"
/// A double that replies with one fixed status/body and records the requests it received.
/// The multi-reply scripted double used by the reliability examples lives in the testing guide.
type RecordingHttp(status: int, body: string) =
let sent = ResizeArray<HttpRequest>()
member _.Sent = List.ofSeq sent
member this.Env : TestEnv = { Http = this }
interface IHttp with
member _.Send(request) =
sent.Add request
Flow.succeed (Response.create (DateTimeOffset(2026, 1, 1, 0, 0, 0, TimeSpan.Zero)) status body)
AxialHttpClientAxial.HttpClient.DSLFsLiveDocsGeneratedPage1_03F7AABF2A94.UserId: intintAn abbreviation for the CLI type . Basic Types
Name: stringstringAn abbreviation for the CLI type . Basic Types
FsLiveDocsGeneratedPage1_03F7AABF2A94.TestEnvHttp: IHttpAxial.HttpClient.IHttpSends fully described HTTP requests for a concrete host platform.
Axial.HttpClient.IHasHttpDeclares that an environment supplies the HTTP service. Implement this on the environment supplied at the host edge. A workflow that sends requests constrains its environment with 'env :> IHasHttp.
this: TestEnvHttp: TestEnv -> unit -> IHttpdecodeUser: string -> Result<User,string>json: stringMicrosoft.FSharp.Core.FSharpResult`2Helper type for error handling without exceptions. Choices and Results
found: Text.RegularExpressions.MatchTextMatch: string * string -> Text.RegularExpressions.MatchSearches the specified input string for the first occurrence of the specified regular expression. The string to search for a match. The regular expression pattern to match. An object that contains information about the match. A regular expression parsing error occurred. or is . A time-out occurred. For more information about time-outs, see the Remarks section.
RegularExpressionsSystem.Text.RegularExpressions.RegexRepresents an immutable regular expression.
Success: boolGets a value indicating whether the match is successful. if the match is successful; otherwise, .
OkRepresents an OK or a Successful result. The code succeeded with a value of 'T.
int: ^T -> intConverts the argument to signed 32-bit integer. This is a direct conversion for all primitive numeric types. For strings, the input is converted using Int32.Parse() with InvariantCulture settings. Otherwise the operation requires an appropriate static conversion method on the input type. The input value. The converted int int 'A' // evaluates to 65 int 0xff // evaluates to 255 int -10 // evaluates to -10
Groups: Text.RegularExpressions.GroupCollectionGets a collection of groups matched by the regular expression. The character groups matched by the pattern.
Item: Text.RegularExpressions.GroupEnables access to a member of the collection by integer index. The zero-based index of the collection member to be retrieved. The member of the collection specified by .
Value: stringGets the captured substring from the input string. The substring that is captured by the match.
ErrorRepresents an Error or a Failure. The code failed with a value of 'TError representing what went wrong.
FsLiveDocsGeneratedPage1_03F7AABF2A94.RecordingHttpstatus: intbody: stringsent: ResizeArray<HttpRequest>``.ctor``: unit -> unitInitializes a new instance of the class that is empty and has the default initial capacity.
Axial.HttpClient.HttpRequestAn immutable, fully described HTTP request.
_: RecordingHttpSent: RecordingHttp -> unit -> HttpRequest listMicrosoft.FSharp.Collections.ListModuleContains operations for working with values of type . Operations for collections such as lists, arrays, sets, maps and sequences. See also F# Collection Types in the F# Language Guide.
ofSeq: 'T seq -> 'T listBuilds a new list from the given enumerable object. The input sequence. The list of elements from the sequence. let inputs = seq { 1; 2; 5 } inputs |> List.ofSeq Evaluates to [ 1; 2; 5 ]. This is an O(n) operation, where n is the length of the sequence.
this: RecordingHttpEnv: RecordingHttp -> unit -> TestEnvSend: RecordingHttp -> HttpRequest -> Flow<unit,HttpError,HttpResponse>request: HttpRequestAdd: HttpRequest -> unitAdds an object to the end of the . The object to be added to the end of the . The value can be for reference types.
Axial.Flowsucceed: 'value -> Flow<'env,'error,'value>Same as ok. The value to wrap in a successful flow. A flow that always succeeds with the provided value. let result = Flow.succeed 42 |> Flow.run () // result = Success 42
Axial.HttpClient.ResponseModulecreate: DateTimeOffset -> int -> string -> HttpResponseCreates a synthetic response transcript at an explicit start time, primarily for test fakes. <example><code>Response.create startedAt 200 """{"ok":true}"""</code></example>
``.ctor``: int * int * int * int * int * int * TimeSpan -> unitInitializes a new instance of the structure using the specified year, month, day, hour, minute, second, and offset. The year (1 through 9999). The month (1 through 12). The day (1 through the number of days in ). The hours (0 through 23). The minutes (0 through 59). The seconds (0 through 59). The time's offset from Coordinated Universal Time (UTC). does not represent whole minutes. is less than one or greater than 9999. -or- is less than one or greater than 12. -or- is less than one or greater than the number of days in . -or- is less than zero or greater than 23. -or- is less than 0 or greater than 59. -or- is less than 0 or greater than 59. -or- is less than -14 hours or greater than 14 hours. -or- The property is earlier than or later than .
System.TimeSpanRepresents a time interval.
Zero: TimeSpanRepresents the zero value. This field is read-only.
Requires & types
Requires: open Axial; open Axial.HttpClient; open System (packages: Axial, Axial.HttpClient)val decodeUser: string -> Result<User,string>let summary : Flow<TestEnv, HttpError, int * string * string option> =
flow {
let! response = Http.get "https://api.example.com/users" |> Http.send
let etag = response |> Response.tryHeader "ETag" // case-insensitive
return response.StatusCode, response.Text, etag
}
summary: Flow<TestEnv,HttpError,(int * string * string option)>Axial.Flow`3FsLiveDocsGeneratedPage1_03F7AABF2A94.TestEnvAxial.HttpClient.HttpErrorA recoverable HTTP transport, timeout, status, or decoding failure.
intAn abbreviation for the CLI type . Basic Types
stringAn abbreviation for the CLI type . Basic Types
optionThe type of optional values. When used from other CLI languages the empty option is the null value. Use the constructors Some and None to create values of this type. Use the values in the Option module to manipulate values of this type, or pattern match against the values directly. 'None' values will appear as the value null to other CLI languages. Instance methods on this type will appear as static methods to other CLI languages due to the use of null as a value representation. Options
flow: FlowBuilderThe universal flow { } computation expression.
response: HttpResponseAxial.HttpClient.HttpModuleget: string -> HttpRequestCreates a GET request. <example><code>Http.get "https://api.example.com/users"</code></example>
(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
send: HttpRequest -> Flow<'env,HttpError,HttpResponse>Sends a request and fails with <c>HttpError.Status</c> when the response is outside the expectation. <example><code>request |> Http.send</code></example>
etag: string optionAxial.HttpClient.ResponseModuletryHeader: string -> HttpResponse -> string optionFinds the first header with the given case-insensitive name. <example><code>response |> Response.tryHeader "ETag"</code></example>
StatusCode: intThe numeric response status code.
Text: stringThe response body decoded with the response charset (UTF-8 when unspecified).
Requires & types
Requires: open Axial; open Axial.HttpClient (packages: Axial, Axial.HttpClient)val summary: Flow<TestEnv,HttpError,(int * string * string option)>summary |> Flow.run (RecordingHttp(200, "[]").Env) |> shouldEqual (Exit.Success(200, "[]", None))
summary: Flow<TestEnv,HttpError,(int * string * string option)>(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
Axial.Flowrun: 'env -> Flow<'env,'error,'value> -> Exit<'value,'error>Runs the workflow and blocks until the final exit is available. The environment used by the workflow. The workflow to run. The final workflow exit. let exit = workflow |> Flow.run environment
``.ctor``: int * string -> RecordingHttpEnv: TestEnvshouldEqual: 'a -> 'a -> unitAxial.Exit`2Represents the final outcome of a workflow execution. The type of the success value. The type of the domain-specific failure value.
SuccessThe workflow completed successfully.
NoneThe representation of "No value"
Requires & types
Requires: open Axial (packages: Axial)response.Duration records how long the exchange took, measured with the service's IClock.
StatusCode,ReasonPhrase, andHeaders(response plus content headers, in arrival order).Bodyis the exact bytes;Textis decoded with the response charset, defaulting to UTF-8. Neither is redacted, so treat them as sensitive: a body may contain credentials or personal data.Requestis the redacted request line (secret query values and headers are replaced with***), so the request line is safe to log as-is. Do not log the full transcript without boundingBody/Text.StartedAtandDurationtime the full exchange including body download.
Typed JSON Decoding
Response.json and the fetchJson/Http.getJson terminals take a decoder of type
string -> Result<'value, string>. Any JSON library fits that shape:
let user (userId: int) : Flow<TestEnv, HttpError, User> =
GET $"https://api.example.com/users/{userId}"
|> fetchJson decodeUser // Reified.Schema, Thoth, or hand-written
user: int -> Flow<TestEnv,HttpError,User>userId: intintAn abbreviation for the CLI type . Basic Types
Axial.Flow`3FsLiveDocsGeneratedPage1_03F7AABF2A94.TestEnvAxial.HttpClient.HttpErrorA recoverable HTTP transport, timeout, status, or decoding failure.
FsLiveDocsGeneratedPage1_03F7AABF2A94.UserGET: FormattableString -> HttpRequestCreates a GET request from an interpolated URL. Every hole is URL-encoded as one value. <example><code>GET $"https://api.example.com/users/{userId}"</code></example>
(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
fetchJson: (string -> Result<'a,string>) -> HttpRequest -> Flow<'b,HttpError,'a>Sends the request and decodes the JSON response. <example><code>GET $"{root}/users/{id}" |> fetchJson (Json.deserializeResult codec)</code></example>
decodeUser: string -> Result<User,string>Requires & types
Requires: open Axial; open Axial.HttpClient; open Axial.HttpClient.DSL (packages: Axial, Axial.HttpClient)val user: int -> Flow<TestEnv,HttpError,User>user 1 |> Flow.run (RecordingHttp(200, """{"id":1,"name":"Ada"}""").Env) |> shouldEqual (Exit.Success { Id = 1; Name = "Ada" })
match user 1 |> Flow.run (RecordingHttp(200, "not json").Env) with
| Exit.Failure(Cause.Fail(HttpError.DecodeFailed _)) -> ()
| other -> failwithf "expected a decode failure, got %A" other
user: int -> Flow<TestEnv,HttpError,User>(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
Axial.Flowrun: 'env -> Flow<'env,'error,'value> -> Exit<'value,'error>Runs the workflow and blocks until the final exit is available. The environment used by the workflow. The workflow to run. The final workflow exit. let exit = workflow |> Flow.run environment
``.ctor``: int * string -> RecordingHttpEnv: TestEnvshouldEqual: 'a -> 'a -> unitAxial.Exit`2Represents the final outcome of a workflow execution. The type of the success value. The type of the domain-specific failure value.
SuccessThe workflow completed successfully.
Id: intName: stringFailureThe workflow failed due to a specific cause.
Axial.Cause`1Represents the cause of a failed workflow. The type of the domain-specific failure value.
FailAn expected domain-specific failure.
Axial.HttpClient.HttpErrorA recoverable HTTP transport, timeout, status, or decoding failure.
DecodeFailedThe response body could not be decoded into the requested value.
other: Exit<User,HttpError>failwithf: Printf.StringFormat<'T,'Result> -> 'TPrint to a string buffer and raise an exception with the given result. Helper printers must return strings. The formatter. The formatted result. See Printf.failwithf (link: ) for examples.
Requires & types
Requires: open Axial; open Axial.HttpClient (packages: Axial, Axial.HttpClient)A decoder failure becomes HttpError.DecodeFailed(message, response). It carries the full transcript, so the
error handler can log the offending payload without re-fetching it.
To POST a value and decode the reply in one step:
let encodeUser (user: User) = $"{{\"id\":{user.Id},\"name\":\"{user.Name}\"}}"
let created (newUser: User) : Flow<TestEnv, HttpError, User> =
Http.postJson encodeUser decodeUser "https://api.example.com/users" newUser
encodeUser: User -> stringuser: UserFsLiveDocsGeneratedPage1_03F7AABF2A94.Usercreated: User -> Flow<TestEnv,HttpError,User>newUser: UserAxial.Flow`3FsLiveDocsGeneratedPage1_03F7AABF2A94.TestEnvAxial.HttpClient.HttpErrorA recoverable HTTP transport, timeout, status, or decoding failure.
Axial.HttpClient.HttpModulepostJson: ('input -> string) -> (string -> Result<'value,string>) -> string -> 'input -> Flow<'env,HttpError,'value>Encodes a value as JSON, POSTs it, and decodes the JSON response. <example><code>Http.postJson (Json.serialize codec) (Json.deserializeResult codec) url user</code></example>
decodeUser: string -> Result<User,string>Requires & types
Requires: open Axial; open Axial.HttpClient (packages: Axial, Axial.HttpClient)val encodeUser: User -> stringval created: User -> Flow<TestEnv,HttpError,User>let service = RecordingHttp(201, """{"id":7,"name":"Ada"}""")
created { Id = 0; Name = "Ada" } |> Flow.run service.Env |> shouldEqual (Exit.Success { Id = 7; Name = "Ada" })
service.Sent |> List.map (Request.plan >> _.Body) |> shouldEqual [ "application/json (22 characters)" ]
service: RecordingHttp``.ctor``: int * string -> RecordingHttpcreated: User -> Flow<TestEnv,HttpError,User>Id: intName: string(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
Axial.Flowrun: 'env -> Flow<'env,'error,'value> -> Exit<'value,'error>Runs the workflow and blocks until the final exit is available. The environment used by the workflow. The workflow to run. The final workflow exit. let exit = workflow |> Flow.run environment
Env: TestEnvshouldEqual: 'a -> 'a -> unitAxial.Exit`2Represents the final outcome of a workflow execution. The type of the success value. The type of the domain-specific failure value.
SuccessThe workflow completed successfully.
Sent: HttpRequest listMicrosoft.FSharp.Collections.ListModuleContains operations for working with values of type . Operations for collections such as lists, arrays, sets, maps and sequences. See also F# Collection Types in the F# Language Guide.
map: ('T -> 'U) -> 'T list -> 'U listBuilds a new collection whose elements are the results of applying the given function to each of the elements of the collection. The function to transform elements from the input list. The input list. The list of transformed elements. let inputs = [ "a"; "bbb"; "cc" ] inputs |> List.map (fun x -> x.Length) Evaluates to [ 1; 3; 2 ] This is an O(n) operation, where n is the length of the list.
Axial.HttpClient.RequestModuleplan: HttpRequest -> RequestPlanReturns a redacted request plan without sending anything. <example><code>Request.plan request</code></example>
(>>): ('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3Compose two functions, the function on the left being applied first The first function to apply. The second function to apply. The composition of the input functions. let addOne x = x + 1 let doubleIt x = x * 2 let addThenDouble = addOne >> doubleIt addThenDouble 3 // Evaluates to 8
_arg1: RequestPlanBody: stringRequires & types
Requires: open Axial; open Axial.HttpClient (packages: Axial, Axial.HttpClient)val service: RecordingHttpOne Error Type
HTTP failures are cases of HttpError. Handle the cases your workflow can recover from, and fall back to
HttpError.describe for the rest:
let explain (error: HttpError) =
match error with
| HttpError.Status response -> $"status {response.StatusCode}" // outside the expectation, full transcript
| HttpError.DecodeFailed(message, _) -> $"unexpected body: {message}" // did not decode, full transcript
| other -> HttpError.describe other
explain: HttpError -> stringerror: HttpErrorAxial.HttpClient.HttpErrorA recoverable HTTP transport, timeout, status, or decoding failure.
StatusThe response arrived with a status outside the request's expectation.
response: HttpResponseDecodeFailedThe response body could not be decoded into the requested value.
message: stringother: HttpErrorAxial.HttpClient.HttpErrorModuledescribe: HttpError -> stringFormats an HTTP error with its redacted request context. <example><code>error |> HttpError.describe</code></example>
Requires & types
Requires: open Axial.HttpClient (packages: Axial.HttpClient)val explain: HttpError -> stringmatch user 1 |> Flow.run (RecordingHttp(503, "").Env) with
| Exit.Failure(Cause.Fail error) -> explain error |> shouldEqual "status 503"
| other -> failwithf "expected a status error, got %A" other
user: int -> Flow<TestEnv,HttpError,User>(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
Axial.Flowrun: 'env -> Flow<'env,'error,'value> -> Exit<'value,'error>Runs the workflow and blocks until the final exit is available. The environment used by the workflow. The workflow to run. The final workflow exit. let exit = workflow |> Flow.run environment
``.ctor``: int * string -> RecordingHttpEnv: TestEnvAxial.Exit`2Represents the final outcome of a workflow execution. The type of the success value. The type of the domain-specific failure value.
FailureThe workflow failed due to a specific cause.
Axial.Cause`1Represents the cause of a failed workflow. The type of the domain-specific failure value.
FailAn expected domain-specific failure.
error: HttpErrorexplain: HttpError -> stringshouldEqual: 'a -> 'a -> unitother: Exit<User,HttpError>failwithf: Printf.StringFormat<'T,'Result> -> 'TPrint to a string buffer and raise an exception with the given result. Helper printers must return strings. The formatter. The formatted result. See Printf.failwithf (link: ) for examples.
Requires & types
Requires: open Axial (packages: Axial)Interrupting the workflow is not one of them: the request is abandoned and the flow ends with Cause.Interrupt,
so no error handler has to recognize a cancellation it did not ask for.
The full six-case union, together with HttpError.describe, HttpError.tryResponse, HttpError.isTransient, and
HttpError.transientRetry, is listed in the HttpError reference.
Statuses Are Data, Not Exceptions
Http.send fails with HttpError.Status for anything outside the request's expectation (2xx by default).
When a "failure" status is a normal outcome, widen the expectation and branch on the code:
let findUser (userId: int) : Flow<TestEnv, HttpError, User option> =
flow {
let! response =
GET $"https://api.example.com/users/{userId}"
|> expect [ 200; 404 ]
|> fetch
if response.StatusCode = 404 then return None
else return! response |> Response.json decodeUser |> Result.map Some
}
findUser: int -> Flow<TestEnv,HttpError,User option>userId: intintAn abbreviation for the CLI type . Basic Types
Axial.Flow`3FsLiveDocsGeneratedPage1_03F7AABF2A94.TestEnvAxial.HttpClient.HttpErrorA recoverable HTTP transport, timeout, status, or decoding failure.
FsLiveDocsGeneratedPage1_03F7AABF2A94.UseroptionThe type of optional values. When used from other CLI languages the empty option is the null value. Use the constructors Some and None to create values of this type. Use the values in the Option module to manipulate values of this type, or pattern match against the values directly. 'None' values will appear as the value null to other CLI languages. Instance methods on this type will appear as static methods to other CLI languages due to the use of null as a value representation. Options
flow: FlowBuilderThe universal flow { } computation expression.
response: HttpResponseGET: FormattableString -> HttpRequestCreates a GET request from an interpolated URL. Every hole is URL-encoded as one value. <example><code>GET $"https://api.example.com/users/{userId}"</code></example>
(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
expect: int seq -> HttpRequest -> HttpRequestReplaces the statuses treated as success. <example><code>request |> expect [ 200; 404 ]</code></example>
fetch: HttpRequest -> Flow<'a,HttpError,HttpResponse>Sends the request and returns the full transcript, failing on unexpected statuses. <example><code>GET $"{root}/users" |> fetch</code></example>
StatusCode: intThe numeric response status code.
(=): 'T -> 'T -> boolStructural equality The first parameter. The second parameter. The result of the comparison. 5 = 5 // Evaluates to true 5 = 6 // Evaluates to false [1; 2] = [1; 2] // Evaluates to true (1, 5) = (1, 6) // Evaluates to false
NoneThe representation of "No value"
Axial.HttpClient.ResponseModulejson: (string -> Result<'value,string>) -> HttpResponse -> Result<'value,HttpError>Decodes the response body with the supplied decoder, mapping failure to <c>HttpError.DecodeFailed</c>. <example><code>response |> Response.json (Json.deserializeResult codec)</code></example>
decodeUser: string -> Result<User,string>Microsoft.FSharp.Core.ResultModuleContains operations for working with values of type . Choices and Results
map: ('T -> 'U) -> Result<'T,'TError> -> Result<'U,'TError>map f inp evaluates to match inp with Error e -> Error e | Ok x -> Ok (f x). A function to apply to the OK result value. The input result. A result of the input value after applying the mapping function, or Error if the input is Error. Ok 1 |> Result.map (fun x -> "perfect") // evaluates to Ok "perfect" Error "message" |> Result.map (fun x -> "perfect") // evaluates to Error "message"
SomeThe representation of "Value of type 'T" The input value. An option representing the value.
Requires & types
Requires: open Axial; open Axial.HttpClient; open Axial.HttpClient.DSL (packages: Axial, Axial.HttpClient)val findUser: int -> Flow<TestEnv,HttpError,User option>findUser 9 |> Flow.run (RecordingHttp(404, "").Env) |> shouldEqual (Exit.Success None)
findUser 1 |> Flow.run (RecordingHttp(200, """{"id":1,"name":"Ada"}""").Env) |> shouldEqual (Exit.Success(Some { Id = 1; Name = "Ada" }))
findUser: int -> Flow<TestEnv,HttpError,User option>(|>): 'T1 -> ('T1 -> 'U) -> 'UApply a function to a value, the value being on the left, the function on the right The argument. The function. The function result. let doubleIt x = x * 2 3 |> doubleIt // Evaluates to 6
Axial.Flowrun: 'env -> Flow<'env,'error,'value> -> Exit<'value,'error>Runs the workflow and blocks until the final exit is available. The environment used by the workflow. The workflow to run. The final workflow exit. let exit = workflow |> Flow.run environment
``.ctor``: int * string -> RecordingHttpEnv: TestEnvshouldEqual: 'a -> 'a -> unitAxial.Exit`2Represents the final outcome of a workflow execution. The type of the success value. The type of the domain-specific failure value.
SuccessThe workflow completed successfully.
NoneThe representation of "No value"
SomeThe representation of "Value of type 'T" The input value. An option representing the value.
Id: intName: stringRequires & types
Requires: open Axial (packages: Axial)Http.sendResult skips status interpretation entirely and returns whatever arrived; use it when a proxy or
health check needs the raw exchange.
When Not To Decode
fetchText and fetchBytes return the body directly for HTML scraping, file downloads, and pass-through
proxying. Use fetchJson only when the payload should become a typed value; decoding a body you will
immediately re-serialize wastes the transcript you already have.

