web-dev-qa-db-fra.com

Comment faire une demande d'API dans Kotlin?

Je suis extrêmement nouveau pour Kotlin et les API en général et je ne trouve pas la syntaxe pour créer une demande d'API utilisant ce langage. Je crée une version mobile d'un site Web et j'utilise donc Android Studio pour créer une nouvelle interface utilisateur pour un backend déjà établi. Quelles sont les étapes et la syntaxe pour créer une demande? Toute aide est très appréciée.

13
Nutters

Une fois que vous avez configurez votre Android Studio pour utiliser Kotlin }, il est assez simple de passer un appel REST, et la logique est la même qu'en Java. 


Voici un exemple d'appel REST avec OkHttp :

build.gradle

dependencies {
    //...
    implementation 'com.squareup.okhttp3:okhttp:3.8.1'
}

AndroidManifest.xml

<uses-permission Android:name="Android.permission.INTERNET" />

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val client = OkHttpClient()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        run("https://api.github.com/users/Evin1-/repos")
    }

    fun run(url: String) {
        val request = Request.Builder()
                .url(url)
                .build()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {}
            override fun onResponse(call: Call, response: Response) = println(response.body()?.string())
        })
    }
}

Vous trouverez ci-dessous quelques exemples plus complexes avec d'autres bibliothèques:

26
Evin1_

vous pouvez utiliser Retrofit ou AsyncTask, exemple de AsyncTask:

    class getData() : AsyncTask<Void, Void, String>() {
        override fun doInBackground(vararg params: Void?): String? {
        }

        override fun onPreExecute() {
            super.onPreExecute()
        }

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
        }
}

pour Retrofit vérifier ce awsome tutorial

5
Oussema Aroua

Retrofit est un bon outil pour consommer les API sur Android. Here est un tutoriel que j'ai trouvé sur l'utilisation de Retrofit sur Kotlin

2
MacLean Sochor

J'ai créé un exemple d'appel d'API à l'aide de retrofit 2. Premièrement, ajoutez ces bibliothèques en dégradé.

implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"

puis créez une classe pour configurer Retrofit 2, dit Connect.kt

class Connect {

    companion object {

        private fun getRetrofit(Url:String):Retrofit {
            return Retrofit.Builder()
                    .addCallAdapterFactory(
                            RxJava2CallAdapterFactory.create())
                    .addConverterFactory(
                            GsonConverterFactory.create())
                    .baseUrl(Url)
                    .build()
        }

        fun getApiData():Retrofit{
            val retrofitApi = getRetrofit(Url.BASE_URL)
            return retrofitApi
        }

        fun callApi():CallApi{
            val retrofitCall = getApiData()
            return retrofitCall.create(CallApi::class.Java)
        }

    }
}

J'ai créé une URL dans la classe Url dire Url.kt

class Url {
    companion object {
        const val BASE_URL = "your base url"
        const val URL = "your url"
    }
}

Création d'une interface pour l'appel Api

    interface CallApi {

        @GET(Url.URL)
//query needed if there is any query
        fun getApi(@Query("limit") limit: Int):
//model class is needed                
Observable<Model.Result>
    }

Créez une classe de modèle en fonction de votre réponse, exemple de réponse

{
    "data": {
        "children": [
            {
                "data": {
                    "author": "",
                     "thumbnail":"",
                      "title":""
                     }
                 }]
          }
 }

pour créer sa classe de modèle, créer un objet, par exemple, Modèle

object Model {
    data class Result(val data: Data)
    data class Data(val children: List<Children>)
    data class Children(val data: Datas)
    data class Datas(val author: String,val thumbnail: String,val title: String)
}

Créez ensuite une classe de plaques de chaudière pour extraire les données de api pouvant être appelées depuis n'importe quelle activité.

class ApiData {
    companion object {
        const val count = 10
        val api by lazy { Connect.callApi() }
        var disposable: Disposable? = null
        fun apiData(callback:Response){
            disposable = api.getApi(count)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe ({
                        result ->
                        callback.data(result,true)
                    }, { error ->
                        error.printStackTrace()
                    })

        }

    }
    interface Response {
        fun data(data:Model.Result,status:Boolean)
    }
}

maintenant il peut être appelé d'activité, comme

ApiData.apiData( object :ApiData.Response{
    override fun data(data: Model.Result, status: Boolean) {
        if(status){
            val items:List<Model.Children> = data.data.children
        }
    }

})
0
Rejsal