Ktor Integration¶
Sandwich provides seamless extensions for ApiResponse when working with Ktor. If you're developing a Kotlin Multiplatform project, it's strongly advised to use Sandwich Ktor because Retrofit is limited to Android. You can access ApiResponse through the _ApiResponse extensions when working with the HttpClient.
To utilize these Ktor supports, simply add the following dependency:
dependencies {
implementation "com.github.skydoves:sandwich-ktor:$version"
}
dependencies {
implementation("com.github.skydoves:sandwich-ktor:$version")
}
For Kotlin Multiplatform, add the dependency below to your module's build.gradle.kts file:
sourceSets {
val commonMain by getting {
dependencies {
implementation("com.github.skydoves:sandwich-ktor:$version")
}
}
}
ApiResponse from the HttpClient¶
val client = HttpClient { .. }
val apiResponse = client.requestApiResponse<PokemonResponse>(REQUEST_URL)
val apiResponse = client.getApiResponse<PokemonResponse>(REQUEST_URL)
val apiResponse = client.postApiResponse<PokemonResponse>(REQUEST_URL)
val apiResponse = client.deleteApiResponse<PokemonResponse>(REQUEST_URL)
val apiResponse = client.patchApiResponse<PokemonResponse>(REQUEST_URL)
val apiResponse = client.headApiResponse<PokemonResponse>(REQUEST_URL)
You can also utilize the HttpRequestBuilder:
val response = client.getApiResponse<PokemonResponse>("https://pokeapi.co/api/v2/pokemon") {
contentType(ContentType.Application.Json)
}
response.onSuccess {
..
}.onError {
..
}.onException {
..
}
ApiResponse Extensions for Ktor¶
The sandwich-ktor package provides valuable property extensions for ApiResponse.
ApiResponse.Success¶
This indicates a successful network request. From the ApiResponse.Success, you can retrieve the response's body data as well as supplementary details such as StatusCode, Headers, and more.
val data: List<Poster> = response.data // or response.body()
val statusCode: StatusCode = response.statusCode
val headers: Headers = response.headers
val httpResponse: HttpResponse = response.httpResponse
ApiResponse.Failure.Error¶
This denotes a failed network request, typically due to bad requests or internal server errors. You can access error messages and additional information like StatusCode, Headers, and more from the ApiResponse.Failure.Error.
val bodyChannel: String = response.bodyChannel()
val bodyString: String = response.bodyString()
val statusCode: StatusCode = response.statusCode
val headers: Headers = response.headers