Future-based backends¶
There are several backend implementations which are scala.concurrent.Future
-based. These backends are asynchronous, sending a request is a non-blocking operation and results in a response wrapped in a Future
.
Apart from the ones described below, also the Akka backend is Future
-based.
Class | Supported stream type | Websocket support |
---|---|---|
AkkaHttpBackend |
akka.stream.scaladsl.Source[ByteString, Any] |
akka-streams |
AsyncHttpClientFutureBackend |
n/a | wrapping a low-level Java interface |
OkHttpFutureBackend |
n/a | wrapping a low-level Java interface |
HttpClientFutureBackend (Java11+) |
n/a | wrapping a low-level Java interface |
Using async-http-client¶
To use, add the following dependency to your project:
"com.softwaremill.sttp.client" %% "async-http-client-backend-future" % "2.2.5"
And some imports:
import sttp.client._
import sttp.client.asynchttpclient.future.AsyncHttpClientFutureBackend
This backend depends on async-http-client and uses Netty behind the scenes.
Next you’ll need to add an implicit value:
implicit val sttpBackend = AsyncHttpClientFutureBackend()
or, if you’d like to use custom configuration:
import org.asynchttpclient.AsyncHttpClientConfig
val config: AsyncHttpClientConfig = ???
implicit val sttpBackend = AsyncHttpClientFutureBackend.usingConfig(config)
or, if you’d like to use adjust the configuration sttp creates:
import org.asynchttpclient.DefaultAsyncHttpClientConfig
val sttpOptions: SttpBackendOptions = SttpBackendOptions.Default
val adjustFunction: DefaultAsyncHttpClientConfig.Builder => DefaultAsyncHttpClientConfig.Builder = ???
implicit val sttpBackend = AsyncHttpClientFutureBackend.usingConfigBuilder(adjustFunction, sttpOptions)
or, if you’d like to instantiate the AsyncHttpClient yourself:
import org.asynchttpclient.AsyncHttpClient
val asyncHttpClient: AsyncHttpClient = ???
implicit val sttpBackend = AsyncHttpClientFutureBackend.usingClient(asyncHttpClient)
Using OkHttp¶
To use, add the following dependency to your project:
"com.softwaremill.sttp.client" %% "okhttp-backend" % "2.2.5"
and some imports:
import sttp.client.okhttp.OkHttpFutureBackend
import scala.concurrent.ExecutionContext.Implicits.global
Create the backend using:
implicit val sttpBackend = OkHttpFutureBackend()
or, if you’d like to instantiate the OkHttpClient yourself:
import okhttp3.OkHttpClient
val asyncHttpClient: OkHttpClient = ???
implicit val sttpBackend = OkHttpFutureBackend.usingClient(asyncHttpClient)
This backend depends on OkHttp and fully supports HTTP/2.
Using HttpClient (Java 11+)¶
To use, add the following dependency to your project:
"com.softwaremill.sttp.client" %% "httpclient-backend" % "2.2.5"
and some imports:
import sttp.client.httpclient.HttpClientFutureBackend
import scala.concurrent.ExecutionContext.Implicits.global
Create the backend using:
implicit val sttpBackend = HttpClientFutureBackend()
or, if you’d like to instantiate the HttpClient yourself:
import java.net.http.HttpClient
val client: HttpClient = ???
implicit val sttpBackend = HttpClientFutureBackend.usingClient(client)
This backend is based on the built-in java.net.http.HttpClient
available from Java 11 onwards, works with all Scala versions. A Dotty build is available as well.
Streaming¶
The Akka backend supports streaming using akka-streams.
Other backends don’t support non-blocking streaming.
Websockets¶
The Akka backend supports websockets through a high-level, streaming, akka-streams-based interface.
Other backends support websockets by wrapping the appropriate low-level Java interface.