Goals of the project

  • provide a simple, discoverable, no-surprises, reasonably type-safe API for making HTTP requests and reading responses

  • separate definition of a request from request execution

  • provide immutable, easily modifiable data structures for requests and responses

  • support multiple execution backends, both synchronous and asynchronous

  • provide support for backend-specific request/response streaming

  • minimum dependencies

See also the blog posts:

Non-goals of the project

  • implement a full HTTP client. Instead, sttp client wraps existing HTTP clients, providing a consistent, programmer-friendly API. All network-related concerns such as sending the requests, connection pooling, receiving responses are delegated to the chosen backend

  • provide ultimate flexibility in defining the request. While it’s possible to define most valid HTTP requests, e.g. some of the less common body chunking approaches aren’t available

How is sttp different from other libraries?

  • immutable request builder which doesn’t impose any order in which request parameters need to be specified. Such an approach allows defining partial requests with common cookies/headers/options, which can later be specialized using a specific URI and HTTP method.

  • support for multiple backends, both synchronous and asynchronous, with backend-specific streaming support

  • URI interpolator with context-aware escaping, optional parameters support and parameter collections

  • description of how to handle the response is combined with the description of the request to send