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.
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:
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
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
}
}
})