In this chapter we are going to learn what is Retrofit and how to implement Retrofit Rest Client in Android application. As of now(2023 Jan) current version of Retrofit is "2.9.0". Retrofit is a network library which is developed by Square and it is a type-safe Rest client for Android. It is easy to use, such as calling or asynchronous processing, and is faster than other libraries such as Volley, so it has become a popular library.
To make retrofit more connectivity in the application we will use OkHttp together
OkHttp is a client which will helps us to use use Http easy way
![]() |
CLASSES USED IN RETROFIT
POJO(Model) Class: A model class contains the objects to be obtained from the JSON file.
Retrofit Instance: This is a Java class. It is used to send requests to an API.
Interface Class: This is a Java class. It is used to define endpoints.
Add the retrofit dependency in gradle file
1. Add Retrofit dependencies inside gradle file
implementation 'com.squareup.retrofit2:retrofit:2.9.0' |
Add Internet permission to Manifest file.
Because of http communication, additional internet permission is required
<uses-permission android:name="android.permission.INTERNET"/> |
2. Create POJO (Model class)
Before create the Model classes we need to check the response of API.
Here we are using BookCategory api (from rrtutors)which will return books category.
This will return the response
{"categorylist":[{"id":"1","name":"Programming Books"},{"id":"2","name":"Entertainment Books"},{"id":"3","name":"Sports Books"},{"id":"4","name":"Business Books"},{"id":"5","name":"Love & Romance"},{"id":"6","name":"Fun Books"},{"id":"7","name":"Love & Romantic"},{"id":"8","name":"History"},{"id":"9","name":"Quotes Books"},{"id":"10","name":"Devotional Books"},{"id":"12","name":"Horror Books"},{"id":"13","name":"Academic"},{"id":"14","name":"Science Fiction"}],"success":1} |
So we need two model classes based on the response. We can create Model classes easily by using "https://json2kt.com/" tool which will convert json data to model classes.
Our Model classes will be like below
Categorylist.kt
import com.google.gson.annotations.SerializedName
@SerializedName("id" ) var id : String? = null, ) |
BookCategory.kt
import com.google.gson.annotations.SerializedName
@SerializedName("categorylist" ) var categorylist : ArrayList<Categorylist> = arrayListOf(), ) |
@SerializedName is used to map the POJO object into JSON response properties.
3. Create Retrofit Instance
We need to create the Retrofit instance to send the network requests. we need to use the Retrofit Builder class and specify the base URL for the service
To create Retrofit instance we will use Retrofit Builder class. For this we will pass the Base URl of the Rest API, add GsonConverterFactory along with OkHttpClient instance.
class AppClientManager private constructor() { |
4. Write Retrofit Interface to make the Network request methods
Now its time to write our network method calls. To do this we need to create an Interface and create methods for the network api methods.
APiService.kt
interface ApiService { |
here our rest api is get method, so we used @GET annotation for the method. We can use other methods like @POST, @PUT, @DELETE, @PATCH, or @HEAD
The endpoints are defined inside the interface using retrofit annotations to encode details about the parameters and request method. T return value is always a parameterized Call<T>.
Because the POJO classes are wrapped into a typed Retrofit Call class.
Method Parameters :
@Body — Sends Java objects as the request body.
@Url — use dynamic URLs.
@Query — We can simply add a method parameter with @Query() and a query parameter name, describing the type.
To URL encode a query using the form:
@Query(value = “auth_token”,encoded = true) String auth_token
5. Fetch Response and update on the UI
val apiInterface = AppClientManager.client.create(ApiService::class.java); override fun onFailure(call: Call<BookCategory>, t: Throwable) { |
If we get the response from the API, it will trigger inside onResposne() callback and we can handle the resposne data.
If the API get any errors then it will trigger inside onFailure() callback and we can show respected error message to the user.
In this sample after fetching the Books Category we just display them on the UI using TextView widget. We can display list of categories inside Recyclerview, but here we are just focused on How to Implement Retrofit in Android application. We will cover Load data to Recyclerview in the coming chapters.
onResponse callback we append response to the TextView.
val k = 0 |
Now run the application on Physical device/emulator, you can fetch the data from API and display on the UI.
![]() |
Complete code For Android Retrofit Example with Kotlin code
MainActivity.kt
package com.example.androidretrofit import android.annotation.SuppressLint import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.TextView import com.example.functionahal.network.ApiService import com.example.functionahal.network.AppClientManager import retrofit2.Call import retrofit2.Callback import retrofit2.Response class MainActivity : AppCompatActivity() { lateinit var txt_response:TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) txt_response=findViewById(R.id.txt_response) txt_response.setText("") val apiInterface = AppClientManager.client.create(ApiService::class.java); apiInterface.getBookCategories().enqueue(object : javax.security.auth.callback.Callback, Callback<BookCategory> { @SuppressLint("SuspiciousIndentation") override fun onResponse(call: Call<BookCategory>, response: Response<BookCategory>) { Log.v("response","Success response ${response.body()!!.categorylist}") val k = 0 for (k in 0 until response!!.body()!!.categorylist.size) txt_response.append("${response!!.body()!!.categorylist[k].name}\n") } override fun onFailure(call: Call<BookCategory>, t: Throwable) { Log.v("response","Error response ${t.message}") } }) } } |
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/txt_response" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:textSize="25sp" android:lineSpacingExtra="4dp" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
build.gradle file
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { namespace 'com.example.androidretrofit' compileSdk 33 defaultConfig { applicationId "com.example.androidretrofit" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.11' } |
Conclusion: In this android chapter we covered what is Retrofit and how to implement Retrofit in android application with using kotlin code.