Search code examples
androidkotlinrx-androidrx-kotlinrx-kotlin2

Simple HTTP request example in Android using Kotlin


I am new to Android development with Kotlin and I am struggling on finding any useful documentation on how to create a simple GET and POST requests with the best current practices as possible. I am coming from an Angular development and there we used a reactive development using RxJS.

Normally I would create a service file that would hold all my request functions, then I would use this service in whichever component and subscribe to the observable.

How would you do this in Android? Is there a good started example of things that have to be created. From the first look, everything looks so complicated and over-engineered


Solution

  • I suggest you to use the official recommendation of OkHttp, or the Fuel library for easier side and it also has bindings for deserialization of response into objects using popular Json / ProtoBuf libraries.

    Fuel example:

    // Coroutines way:
    // both are equivalent
    val (request, response, result) = Fuel.get("https://httpbin.org/ip").awaitStringResponseResult()
    val (request, response, result) = "https://httpbin.org/ip".httpGet().awaitStringResponseResult()
    
    // process the response further:
    result.fold(
        { data -> println(data) /* "{"origin":"127.0.0.1"}" */ },
        { error -> println("An error of type ${error.exception} happened: ${error.message}") }
    )
    
    // Or coroutines way + no callback style:
    try {
        println(Fuel.get("https://httpbin.org/ip").awaitString()) // "{"origin":"127.0.0.1"}"
    } catch(exception: Exception) {
        println("A network request exception was thrown: ${exception.message}")
    }
    
    // Or non-coroutine way / callback style:
    val httpAsync = "https://httpbin.org/get"
        .httpGet()
        .responseString { request, response, result ->
            when (result) {
                is Result.Failure -> {
                    val ex = result.getException()
                    println(ex)
                }
                is Result.Success -> {
                    val data = result.get()
                    println(data)
                }
            }
        }
    
    httpAsync.join()
    

    OkHttp example:

    val request = Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build()
    
    // Coroutines not supported directly, use the basic Callback way:
    client.newCall(request).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            e.printStackTrace()
        }
    
        override fun onResponse(call: Call, response: Response) {
            response.use {
                if (!response.isSuccessful) throw IOException("Unexpected code $response")
    
                for ((name, value) in response.headers) {
                    println("$name: $value")
                }
    
                println(response.body!!.string())
            }
        }
    })