Как сделать запрос API в Kotlin?
Я очень новичок в Kotlin и API в целом и не могу найти синтаксис для создания запроса API с использованием этого языка. Я создаю мобильную версию веб-сайта, поэтому я использую Android Studio для создания нового пользовательского интерфейса для уже установленного бэкенда. Каковы шаги и синтаксис для создания запроса? Любая помощь глубоко ценится.
4 ответов:
После того, как вы настроили свою Android-студию на использование Kotlin, довольно просто выполнить вызов REST, и это в значительной степени та же логика, что и с Java.
Вот пример вызова REST с Ohttp:
Строить.gradle
dependencies { //... implementation 'com.squareup.okhttp3:okhttp:3.8.1' }AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />Основная активность.kt
class MainActivity : AppCompatActivity() { 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()) }) } }
Я создал более сложный пример в этом репозитории, я использовал Dagger, RxJava, Retrofit in ПМК.
Https://github.com/Evin1-/Kotlin-MVP-Dagger2-RxJava-Retrofit
Вы можете использовать
RetrofitилиAsyncTask, Пример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) } }Для
Retrofitпроверьте это awsome учебник
Я создал пример вызова API с помощью retrofit 2. Во-первых, добавьте эти библиотеки в gradle
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"Затем создайте класс для настройки Retrofit 2, скажем 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) } } }Я создал URL-адрес URL-адрес URL-адрес в классе говорят.kt
class Url { companion object { const val BASE_URL = "your base url" const val URL = "your url" } }Создан интерфейс для вызова 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> }Создайте класс модели в соответствии с вашим ответом, пример ответа -
{ "data": { "children": [ { "data": { "author": "", "thumbnail":"", "title":"" } }] } }Для создания класса модели создайте объект, скажем, Model
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) }Затем создайте котловую плиту класс для выполнения выборки данных из api, который может быть вызван из любого действия
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) } }Теперь он может быть вызван из деятельности, как,
ApiData.apiData( object :ApiData.Response{ override fun data(data: Model.Result, status: Boolean) { if(status){ val items:List<Model.Children> = data.data.children } } })
Comments