14.1 REST API v Androide

Pre prácu s REST API používame multiplatformovú knižnicu Ktor. Jej Setup môže byť zložitejší, hlavne ak budeme chcieť implementovať autentifikáciu (Basic, JWT, Bearer a pod.). Najprv uvediem návod bez autentifikácie, v samostatnej kapitole ukážem aj autentifikáciu.

Oficiálne návody:

Ktor Client Setup

Keďže chceme pracovať s internetom, nesmieme zabudnúť pridať Internet permission do AndroidManifest.xml. Je to preto, aby tvoj Android telefón aj GooglePlay vedeli, že aplikácia pracuje s internetom a tým može byť potencionálne nebezpečná.

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Potrebujem pracovat s internetom -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application/>
</manifest>

Následne pridáme závislosti:

dependencies {
    implementation("io.ktor:ktor-client-core:3.5.2")    // nevyhnutne
    implementation("io.ktor:ktor-client-cio:3.5.2")     // nevyhnutne
    
    implementation("io.ktor:ktor-client-content-negotiation:3.5.2") // ak chceme parsovanie JSON
    implementation("io.ktor:ktor-serialization-kotlinx-json:3.5.2") // ak chceme parsovanie JSON
    implementation("io.ktor:ktor-client-logging:3.5.2") // ak chceme vidiet logy
}

V samostatnom súbore, ktorý môžeme pomenovať ktor.kt, alebo api_client.kt a pod. Vytvoríme globálnu konfiguráciu nášho HttpClient-a. Nakonfigurovaný klient bude vedieť či a ako má logovať chyby, ako má parsovať JSONy a či má nejakým spôsobom upravovať každý request pridaním hlavičiek, či úpravou URL.

val client = HttpClient {
    // pri chybe (>= 300) vyhodi exception
    expectSuccess = true

    // povolit logovanie
    install(Logging)

    // uprav kazdy request pridanim hlavicky (nepovinne)
    install(DefaultRequest) {
        headers.appendIfNameAbsent("X-App-Platform", "Android")
    }

    // nastav REST API - pracovanie s JSON
    install(ContentNegotiation) {
        json(Json {
            prettyPrint = true                  // odosielaj pekne formatovany json
            isLenient = true                    // akceptuj chybajuce uvodzovky v json-e
            ignoreUnknownKeys = true            // ignoruj nezname kluce
            decodeEnumsCaseInsensitive = true   // parsuj enumy bez case sensitivity
            explicitNulls = false               // null nastavi vtedy, ak atribut neexistuje, alebo je null
        })
    }
}