# 2020-04-21 | Kotlin | API request & Coroutines ###### tags: `kotlin` `android` `gobelins` `api` `thread` ## Permissions (Manifest.xml) ```xml <uses-permission android:name="android.permission.INTERNET"/> ``` ## Dependencies (build.graddle) ``` // API implementation "com.squareup.retrofit2:retrofit:2.6.0" implementation "com.squareup.okhttp3:okhttp:3.12.2" implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' // COROUTINES implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" implementation "org.jetbrains.kotlinx:kotlinx-coroutinesandroid:1.1.1" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.0-alpha01" ``` ## API [News Api](https://newsapi.org/) ## Classes ```kotlin data class ArticleResult ( val status: String, val totalResults:String, val articles: List<Article> ) data class Article( val source:Source, val author:String, val title:String, val description:String, val url:String, val urlToImage:String, val publishedAt:String, val content:String ) data class Source ( val id:String, val name:String ) ``` ## Service ```kotlin interface ArticleService { @GET("/top-headlines") fun list(): Call<ArticleResult> } ``` ## Repository ```kotlin class Articlepository { private val service: ArticleService init { // Instance retrofit avec url commune de l'api val retrofit = Retrofit.Builder().apply { baseUrl("https://newsapi.org/v2") }.build() // Instance du service service = retrofit.create(ArticleService::class.java) } fun list(): List<Article> { val response = service.list().execute() // Le body peut ĂȘtre nul, alors on anticipe return response.body()?.articles ?: emptyList() } } ``` ## Fragments ```kotlin class ListArticleFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) //Sur le thread principal lifecycleScope.launch { //Faire quelque ici } //Dans un thread secondaire lifecycleScope.launch(Dispatchers.IO) { //Faire quelque ici } } } ```