Skip to content

Latest commit

 

History

History
59 lines (47 loc) · 1.75 KB

responseconverter.md

File metadata and controls

59 lines (47 loc) · 1.75 KB

!!! warning "ResponseConverter is deprecated, use Converter.ResponseConverter instead"

Let`s say you have a function that requests a list of comments

@GET("posts/{postId}/comments")
suspend fun getCommentsByPostId(@Path("postId") postId: Int): List<Comment>

But now you want to directly wrap your comment list in your data holder class e.g. "MyOwnResponse"

sealed class MyOwnResponse<T> {
    data class Success<T>(val data: T) : MyOwnResponse<T>()
    class Error(val ex:Throwable) : MyOwnResponse<Nothing>()

    companion object {
        fun <T> success(data: T) = Success(data)
        fun error(ex: Throwable) = Error(ex)
    }
}

To enable that, you have to implement a ResponseConverter. This class will be used to wrap the Ktor response inside your wrapper class.

class MyOwnResponseConverter : ResponseConverter {

    override suspend fun <RequestType> wrapResponse(
        typeData: TypeData,
        requestFunction: suspend () -> Pair<TypeInfo, HttpResponse>,
        ktorfit: Ktorfit
    ): Any {
        return try {
            val (info, response) = requestFunction()
            MyOwnResponse.success<Any>(response.body(info))
        } catch (ex: Throwable) {
            MyOwnResponse.error(ex)
        }
    }

    override fun supportedType(typeData: TypeData, isSuspend: Boolean): Boolean {
        return typeData.qualifiedName == "com.example.model.MyOwnResponse"
    }
}

You can then add the ResponseConverter on your Ktorfit object.

ktorfit.responseConverter(MyOwnResponseConverter())

Now add MyOwnResponse to your function

@GET("posts/{postId}/comments")
suspend fun getCommentsByPostId(@Path("postId") postId: Int): MyOwnResponse<List<Comment>>