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.
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.
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:
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 } } })
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With