HTTP.Request (http_fetch v0.9.0)

HTTP request configuration struct.

This module provides a structured way to build HTTP requests with proper conversion to the internal HTTP/1.1 wire format. It handles method normalization, header processing, body encoding, and FormData support.

Supported Methods

  • :get - GET requests (no body)
  • :head - HEAD requests (no body)
  • :post - POST requests (with body)
  • :put - PUT requests (with body)
  • :delete - DELETE requests (no body)
  • :patch - PATCH requests (with body)

Usage

# Basic request
request = %HTTP.Request{
  method: :get,
  url: URI.parse("https://api.example.com/data"),
  headers: HTTP.Headers.new([{"Accept", "application/json"}])
}

# POST with JSON body
request = %HTTP.Request{
  method: :post,
  url: URI.parse("https://api.example.com/posts"),
  headers: HTTP.Headers.new([{"Authorization", "Bearer token"}]),
  content_type: "application/json",
  body: JSON.encode!(%{title: "Hello"}),
  http_options: [timeout: 10_000]
}

# FormData upload
form = HTTP.FormData.new()
       |> HTTP.FormData.append_field("name", "John")
       |> HTTP.FormData.append_file("photo", "photo.jpg", file_stream)

request = %HTTP.Request{
  method: :post,
  url: URI.parse("https://api.example.com/upload"),
  body: form
}

Default Headers

The library automatically adds a User-Agent header if not provided, containing information about the runtime environment (OS, architecture, OTP version, Elixir version, and library version).

Summary

Functions

Converts an HTTP.Request struct into legacy :httpc.request/4 arguments.

Converts an HTTP.Request struct into HTTP/1.1 wire iodata.

Types

body_content()

@type body_content() :: String.t() | charlist() | HTTP.FormData.t() | nil

content_type()

@type content_type() :: String.t() | charlist() | nil

method()

@type method() :: :head | :get | :post | :put | :delete | :patch

t()

@type t() :: %HTTP.Request{
  body: body_content(),
  content_type: content_type(),
  headers: HTTP.Headers.t(),
  http_options: Keyword.t(),
  method: method(),
  options: Keyword.t(),
  url: url()
}

url()

@type url() :: URI.t()

Functions

to_httpc_args(req)

@spec to_httpc_args(t()) :: [term()]

Converts an HTTP.Request struct into legacy :httpc.request/4 arguments.

This compatibility helper is preserved for callers that inspect or pass the request shape directly, even though HTTP.fetch/2 no longer uses :httpc.

to_iodata(req)

@spec to_iodata(t()) :: iolist()

Converts an HTTP.Request struct into HTTP/1.1 wire iodata.