Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make an API request in Kotlin?

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 using Android Studio to create a new UI for an already established backend. What are the steps and syntax to creating a request? Any help is deeply appreciated.

like image 496
Nutters Avatar asked Jul 20 '17 15:07

Nutters


People also ask

Can we create API using Kotlin?

An API is an entity that represents an external resource, capable of accepting and responding to protected resource requests made by clients. And this is exactly what the Kotlin app that we just built is, an API.


2 Answers

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
like image 186
Evin1_ Avatar answered Oct 03 '22 18:10

Evin1_


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         }     }  }) 
like image 28
Rejsal Avatar answered Oct 03 '22 18:10

Rejsal