How To Use Retrofit On android With Kotlin

 

Kotlin

Kotlin is a statically typed programming language and it’s runs on the Java virtual machine and also can be compiled to JavaScript source code or use the LLVM compiler infrastructure. It’s developed by the team of JetBrains programmers based in Saint Petersburg, Russia. 

 

What Is Retrofit

Retrofit is a REST Client for Java and Android. It sets easy way to retrieve and upload JSON or other structured data via REST based web service. Retrofit automatically serializes the JSON response using a POJO which must be defined in advanced structure on JSON.

 

Using Retrofit

We have to follow three main classes in retrofit,

  • Model class which is used as a JSON model
  • Interfaces that define the HTTP operations
  • Retrofit Client class

 

We need to add the following dependencies in our Build.gradle file,

 

  • compile “com.squareup.retrofit2:retrofit:2.3.0”
  • compile “com.squareup.retrofit2:converter-gson:2.3.0”
  • compile ‘com.squareup.okhttp3:logging-interceptor:3.10.0’

 

 

API Interface

We need a java interface to make an API call from retrofit, in this API interface we have to define all the URLs with the http request type and parameters. 

 

Here i have listed few type of request details.

 

Methods To Create API Interface

 

We should keep all the requests in a separate interface which are needs to be called in backend,

 

interface APIService {

 

Post Request

 

   @POST("accounts/sign_in")

   fun registrationPost(@Body request: RequestBody): Call<LoginResponse>

 

Put Request

  

    @PUT()

   fun updateUser(@Url url: String,@Body request: RequestBody): Call<ChangePassword>

 

 

 

Delete Request 

   @DELETE()

   fun deletelogTime(@Url url: String): Call<DeleteResponse>

 

 

Get Request

//Fetch all notes

   @GET()

   fun getUserdetails(@Url url: String): Call<UserDetails>

   

   @GET("projects")

   fun getProjectList(@Query("default") default: Boolean): Call<ProjectsList>

     

   @GET("details")

   fun getSummary(@Query("?page_no=1") default: Boolean): Call<SummaryResponse>

 

 

 

Query parameters also added with the @Query annotation on a method parameter. They are automatically added at the end of the URL.

 

 

   @GET("activities")

   fun getActivityList(): Call<ActivitesResponse>

 

}

 

Method used to add the standard backend URL or end point,

 

//**App Utils**

 

object ApiUtils {

  

   val BASE_URL = "Add your backend end point"

 

   val apiService: APIService

       get() = RetrofitClient.getClient(BASE_URL)!!.create(APIService::class.java)

}

 

Retrofit Interface

 

Here we added the application interceptor with header details.

  • To register an application interceptor, we need to call addInterceptor() on OkHttpClient.Builder.
  • To register a Network Interceptor, invoke addNetworkInterceptor() instead of addInterceptor()

 

How To Add API interface into Retrofit Interface,

object RetrofitClient {

 

 var retrofit: Retrofit? = null

   

  fun getClient(baseUrl: String): Retrofit? {

       if (retrofit == null) {

           val interceptor = HttpLoggingInterceptor()

           interceptor.level = HttpLoggingInterceptor.Level.BODY

           val client = OkHttpClient.Builder()

                   .addInterceptor(Interceptor { chain ->

                       val original = chain.request()

                       //header

                       val request = original.newBuilder()

                               .header("Content-Type", "application/json")

                               .header("access-token", Utils.access_token)

                               .header("client", Utils.client)

                               .header("expiry", Utils.expiry)

                               .header("uid", Utils.uid)

                               .method(original.method(), original.body())

                               .build()

                       return@Interceptor chain.proceed(request)

                   })

                   .addInterceptor(interceptor)

                   .connectTimeout(100, TimeUnit.SECONDS)

                   .readTimeout(100, TimeUnit.SECONDS)

                   .build()

           retrofit = Retrofit.Builder()

                   .baseUrl(ApiUtils.BASE_URL)

                   .client(client)

                   .addConverterFactory(GsonConverterFactory.create())

                   .build()

       }

       return retrofit

   }

}

 

The getClient() method will be called every time while setting up a Retrofit interface. Retrofit provides with a list of annotations for each of the HTTP methods: @GET, @POST, @PUT, @DELETE.

 

Tips & Tricks:  Reduce Overdraw From Your Android Application

 

Sample Login Code For Kotlin Using Retrofit

 

Pass the username and password through json format, json is a lightweight data-interchange format.

 

XML Code

 

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.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=".LoginActivity">

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:background="@color/loginBackground"

       android:gravity="center"

       android:orientation="vertical"

       app:layout_constraintBottom_toBottomOf="parent"

       app:layout_constraintLeft_toLeftOf="parent"

       app:layout_constraintRight_toRightOf="parent"

       app:layout_constraintTop_toTopOf="parent">

       <android.support.v7.widget.AppCompatTextView

           android:layout_width="match_parent"

           android:layout_height="wrap_content"

           android:gravity="center"

           android:text=""

           android:textSize="@dimen/_20sdp" />

       <android.support.v7.widget.AppCompatTextView

           android:layout_width="match_parent"

           android:layout_height="wrap_content"

           android:layout_marginTop="@dimen/_5sdp"

           android:gravity="center"

           android:text="@string/login_session"

           android:textSize="@dimen/_15sdp" />

       <android.support.v7.widget.CardView

           android:layout_width="match_parent"

           android:layout_height="wrap_content"

           android:layout_margin="@dimen/_10sdp"

           app:cardCornerRadius="@dimen/_2sdp">

           <LinearLayout

               android:layout_width="match_parent"

               android:layout_height="wrap_content"

               android:layout_margin="@dimen/_5sdp"

               android:orientation="vertical">

               <android.support.design.widget.TextInputLayout

                   android:layout_width="match_parent"

                   android:layout_height="match_parent"

                   android:layout_margin="@dimen/_5sdp">

                   <android.support.design.widget.TextInputEditText

                       android:id="@+id/log_email"

                       android:layout_width="match_parent"

                       android:layout_height="wrap_content"

                       android:layout_marginTop="@dimen/_10sdp"

                       android:drawableStart="@drawable/ic_email_black_24dp"

                       android:drawablePadding="@dimen/_10sdp"

                       android:hint="@string/login_email"

                       android:inputType="textEmailAddress"

                       android:maxLength="30"

                       android:maxLines="1"

                       android:text="" />

               </android.support.design.widget.TextInputLayout>

               <View

                   android:layout_width="match_parent"

                   android:layout_height="@dimen/_1sdp"

                   android:layout_marginTop="@dimen/_5sdp"

                   android:background="#eee">

               </View>

               <android.support.design.widget.TextInputLayout

                   android:layout_width="match_parent"

                   android:layout_height="match_parent"

                   android:layout_margin="@dimen/_5sdp">

                   <android.support.v7.widget.AppCompatEditText

                       android:id="@+id/log_password"

                       android:layout_width="match_parent"

                       android:layout_height="wrap_content"

                       android:layout_marginTop="@dimen/_12sdp"

                       android:drawableStart="@drawable/ic_lock_outline_black_24dp"

                       android:drawablePadding="@dimen/_10sdp"

                       android:hint="@string/login_pass"

                       android:inputType="textPassword"

                       android:maxLength="30"

                       android:maxLines="1"

                       android:imeOptions="actionDone"

                       android:text="" />

               </android.support.design.widget.TextInputLayout>

               <android.support.v7.widget.AppCompatButton

                   android:id="@+id/go"

                   style="@style/Widget.AppCompat.Button.Colored"

                   android:layout_width="match_parent"

                   android:layout_height="@dimen/_42sdp"

                   android:layout_marginTop="@dimen/_10sdp"

                   android:background="@color/colorPrimary"

                   android:onClick="login"

                   android:padding="@dimen/_2sdp"

                   android:text="@string/login_sigin"

                   android:textAllCaps="true"

                   android:textSize="@dimen/_14sdp"

                   android:textStyle="bold"

                   tools:ignore="RtlHardcoded" />

               <android.support.v7.widget.AppCompatTextView

                   android:layout_width="match_parent"

                   android:layout_height="wrap_content"

                   android:layout_margin="@dimen/_7sdp"

                   android:onClick="forgotPassword"

                   android:text="@string/login_forgot"

                   android:textColor="@color/colorPrimary"

                   android:textSize="@dimen/_14sdp"

                   android:textStyle="bold" />

           </LinearLayout>

       </android.support.v7.widget.CardView>

   </LinearLayout>

</android.support.constraint.ConstraintLayout>

 

Kotlin Code

class LoginActivity : AppCompatActivity() {

private var etEmail: TextInputEditText? = null

private var etlog_Email: AppCompatEditText? = null

private var etlog_Pass: AppCompatEditText? = null

private var btn_login: AppCompatButton? = null

private var util: Utils? = null

override fun onCreate(savedInstanceState: Bundle?) {

   super.onCreate(savedInstanceState)

   this.requestWindowFeature(Window.FEATURE_NO_TITLE)

   setContentView(R.layout.activity_login)

   etlog_Email = findViewById(R.id.log_email)

   etlog_Pass = findViewById(R.id.log_password)

   btn_login = findViewById(R.id.go)

   util = Utils;

   util!!.main(applicationContext)

   

if (!util!!.get_emp_email().isEmpty() && !util!!.get_password().isEmpty()) {

       etlog_Email!!.setText(util!!.get_emp_email())

       etlog_Pass!!.setText(util!!.get_password())

 

    }

}

}

 

Validation Code

 

fun login(view: View) {

   hideKeyboard(btn_login!!)

   if (Utils.isNet(applicationContext)) {

       val eMail = etlog_Email?.text.toString()

       val ePass = etlog_Pass?.text.toString()

       if (isValidEmail(eMail)) {

           if (!ePass.isEmpty()) {

               loginAuthendication(eMail, ePass, view)

           } else {

       Snackbar.make(view, "Please enter the password", Snackbar.LENGTH_SHORT).show()

           }

       } else {

       Snackbar.make(view, "Please check the Email ID", Snackbar.LENGTH_SHORT).show()

       }

   } else {

       Snackbar.make(view, R.string.nointernet, Snackbar.LENGTH_SHORT).show()

   }

}

 

Best To Read:  How To Improve The Quality Of Android Apps Using Firebase Test Lab

 

Post Request Using Retrofit

 

fun loginAuthendication(eMail: String, ePass: String, view: View) {

   try {

       Utils.showProgress(this@LoginActivity, "Please wait...")

       val json = JSONObject()

       json.put("email", eMail)

       json.put("password", ePass)

val requestBody: RequestBody = RequestBody.create(MediaType.parse("application/json"), json.toString())

       val call: Call<LoginResponse> = apiService.registrationPost(requestBody)

       call.enqueue(

               object : Callback<LoginResponse> {

                   @SuppressLint("CommitPrefEdits")

                   override fun onResponse(call: Call<LoginResponse>?, response: Response<LoginResponse>?) {

                       if (response!!.isSuccessful) {

                         

                  startActivity(Intent(this@LoginActivity, MainActivity::class.java))

                  finish()

                           //finishAndRemoveTask()

                       } else {

                          

                       }

                   }

                  override fun onFailure(call: Call<LoginResponse>?, t: Throwable?) {

                       Log.d("loginAuthendication", "failure--" + t.toString())

                       Utils.dismissLoader(this@LoginActivity)

                       

                   }

               })

   } catch (e: Exception) {

       Log.d("loginAuthendication", e.toString())

       Utils.dismissLoader(this@LoginActivity)

   }

}

 

The above Android P version requires small changes to do in manifest file because this version google also added the network security feature. So, incase if you don’t want to get blocked by the network security then you can simply add the below code in application tag (manifest) and set the value to be true,

 

android:usesCleartextTraffic="true"

 

 

Retrofit is the powerful network library that can easily connect to HTTP-based API services from your Android App and it will greatly help us in handling API requests which is faster in performance and easy to develop, also it helping us to eliminate the boilerplate code in development so start integrating Retrofit on Kotlin today.

 

 

  

READ NOW >>  Creating Responsive Image Gallery With Ionic