How to make an API request in Kotlin?

前端 未结 4 1967
悲哀的现实
悲哀的现实 2021-01-31 15:29

I am extremely new to Kotlin and APIs in general and can\'t find the syntax to create an API request using this language. I am creating a mobile version of a website so I\'m usi

相关标签:
4条回答
  • 2021-01-31 15:42

    you can use Retrofit or AsyncTask , example of 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)
        }
    }
    

    for Retrofit check this awsome tutorial

    0 讨论(0)
  • 2021-01-31 15:46

    Once you have set your Android Studio to use Kotlin is pretty simple to do a REST call, and it's pretty much the same logic as with Java.


    Here's an example of a REST call with 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())
            })
        }
    }
    

    Below are a few more complicated examples with other libraries:

    • Network request in Kotlin with Retrofit
    • Network request in Kotlin with Retrofit and coroutines
    • Network request in Kotlin with Dagger, RxJava, Retrofit in MVP
    0 讨论(0)
  • 2021-01-31 15:51

    Retrofit is a good tool to consume API's on Android. Here is a tutorial I found on how to use Retrofit on Kotlin

    0 讨论(0)
  • 2021-01-31 15:57

    I have create a sample API call using retrofit 2. Firstly, add these libraries in 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"
    

    then create a class to configure Retrofit 2, say 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)
            }
    
        }
    }
    

    I have created Url in Url class say Url.kt

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

    Created an interface for Api call

        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>
        }
    

    Create a model class according to your response, sample response is

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

    for creating its model class, create an object say, 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)
    }
    

    Then create a boiler plate class to perform data fetch from api which can be called from any activity

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

    now it can be called from activity like,

    ApiData.apiData( object :ApiData.Response{
        override fun data(data: Model.Result, status: Boolean) {
            if(status){
                val items:List<Model.Children> = data.data.children
            }
        }
    
    })
    
    0 讨论(0)
提交回复
热议问题