aboutsummaryrefslogblamecommitdiff
path: root/README.md
blob: 9a98f879178e0aa43d985745c28a40a8f4be115f (plain) (tree)
1
2
3
4
5



                                                
        








                                                                                             







                                                                                                 






                                                                                                                   



                           
        






                                                                                                                  
        



















                                                                                                                       



                                                           
 





                                                                                                 

                                                 
# sttp

The HTTP client for Scala that you always wanted
 
```scala
val state = "closed"
val request = sttp.get(uri"https://api.github.com/repos/adamw/elasticmq/issues?state=$state")
  
val response = request.send(responseAsString("utf-8"))

println(response.header("Content-Length")) // has type Option[String]
println(response.body)                     // has type String
```
 
## Goals of the project

* provide a simple, discoverable, no-surprises, reasonably type-safe API for making HTTP requests
* separate definition of a request from request execution
* provide immutable, easily modifiable data structures for requests and responses
* support both synchronous and asynchronous execution backends
* provide support for backend-specific request/response streaming

## How is sttp different from other libraries?

* immutable request builder which doesn't require the URI to be specified upfront. Allows defining partial requests
which contain 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
* TODO URI interpolator with optional parameters support

## Usage 

First, make sure to import:

```scala
import com.softwaremill.sttp._
```

To send requests, you will also need a backend. A default, synchronous backend based on Java's `HttpURLConnection`
is provided out-of-the box. An implicit value needs to be in scope to invoke `send()` (however it's possible to 
create requests without any implicit backend in scope): 

```scala
implicit val handler = HttpConnectionSttpHandler
```

Any request definition starts from `sttp`: the empty request. This can be further customised, each time yielding a new,
immutable request description (unless a mutable body is set on the request, such as a byte array).

## Request types

All requests have type `RequestTemplate[U]`, where `U[_]` specifies if the request method and URL are specified. There
are two type aliases for the request template that are used:

* `type Request = RequestTemplate[Id]`, where `type Id[X] = X` is the identity, meaning that the request has both a 
method and URI. 
* `type PartialRequest = RequestTemplate[Empty]`, where `type Empty[X] = None`, meaning that the request has neither
a method nor an URI. Both of these fields will be set to `None` (the `Option` subtype).

## Notes

* the encoding for `String`s defaults to `utf-8`.
* unless explicitly specified, the `Content-Type` defaults to:
  * `text/plain` for text
  * `application/x-www-form-urlencoded` for form data
  * `multipart/form-data` for multipart form data
  * `application/octet-stream` for everything else (binary)

## Other Scala HTTP clients

* [scalaj](https://github.com/scalaj/scalaj-http)
* [akka-http client](http://doc.akka.io/docs/akka-http/current/scala/http/client-side/index.html)
* [dispatch](http://dispatch.databinder.net/Dispatch.html)
* [play ws](https://github.com/playframework/play-ws)
* [fs2-http](https://github.com/Spinoco/fs2-http)
* [http4s](http://http4s.org/v0.17/client/)