Skip to content

Latest commit

 

History

History
194 lines (138 loc) · 6.78 KB

part-1.md

File metadata and controls

194 lines (138 loc) · 6.78 KB

Retrofit - Part 1 - GET request

Add dependencies

def retrofitVersion = "2.9.0"
implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"
implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion"

Check the latest version from here: https://github.com/square/retrofit#download

Using Coroutines

Add coroutine if not already added

// Base URL - Must have an ending slash
// ==========================================================================
val BASE_URL = "https://food2fork.ca/api/"    



// MODEL classes
// ==========================================================================

                                              // Model class, JSON response
                                              // from network will be mapped
                                              // to this class.

data class ResponseMain(
    val count: Int,
    val next: String,
    val previous: String,
    val results: List
)

                                              // Another model class.
                                              // The main JSON response contains
                                              // a list of other JSON objects
                                              // using key: "results".
                                              // This class is used for those
                                              // JSON objets.

data class ResponseIndividualRecipe(
    val cooking_instructions: Any,
    val description: String,
    val featured_image: String,
    val ingredients: List,
    val rating: Int,
    val source_url: String,
    val title: String
)

                                              // There can be many other model classes
                                              // as required to map JSON response.

// ==========================================================================



// RETROFIT interface
// Interface functions MUST be suspend functions.
// Function return type - data model class.
// ==========================================================================

                                              // The interface outlines the methods
                                              // to be called for network operations.
                                              // Methods are implemented by retrofit,
                                              // we only need to provide some information
                                              // using annotations.
                                              
                                              // @GET - takes the api end point
                                              // @Header - takes info like token
                                              // @Query - marks query parameters
                                              
// Example: https://food2fork.ca/api/recipe/search/?page=2&query=chicken
// Base URL - https://food2fork.ca/api/
// End point - recipe/search
// Query parameters : "page", "query"

interface RetrofitInterface {

    @GET("recipe/search/")
    suspend fun queryByRecipes(
        @Header("Authorization") token: String,
        @Query("page") pageNo: Int,
        @Query("query") recipes: String
    ): ResponseMain

                                              // There can be other methods
                                              // for GET requests or even
                                              // PUT, POST, DELETE requests

}

// ==========================================================================



// RETROFIT Service object
// ==========================================================================

                                              // Should have the base url,
                                              // converter used here is Gson
                                              // (Converts JSON to Model classes).
                                              // Finally create() takes the
                                              // name of the interface.

val RetrofitService = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build()
    .create(RetrofitInterface::class.java)

// ==========================================================================



//  Make the network call - from a coroutine scope.
// ==========================================================================

class MainActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        CoroutineScope(IO).launch {
            val response = RetrofitService.queryByRecipes(
                token = "Token 9c8b06d329136da358c2d00e76946b0111ce2c48",
                pageNo = 1,
                recipes = "beef"
            )
            println("Result from network: ${response.results.size}")
        }
        
    }

}

// ==========================================================================

Without using Coroutines

// MODEL classes - same as above.

// Retrofit service object - same as above

// Retrofit interface
// Functions MUST NOT be suspend functions.
// They must return a type Call
// ==========================================================================

interface RetrofitInterface {

    @GET("recipe/search/")
    fun queryByRecipesByCall(
        @Header("Authorization") token: String,
        @Query("page") pageNo: Int,
        @Query("query") recipes: String
    ): Call

}

// ==========================================================================


// Make the network call, get the response using callback
// ==========================================================================

val networkCall = RetrofitService.queryByRecipesByCall(
    token = "Token 9c8b06d329136da358c2d00e76946b0111ce2c48",
    pageNo = 1,
    recipes = "beef"
)

                                              // enqueue methods puts the request
                                              // on a queue for retrofit to execute.
                                              // Once the call is executed the callback
                                              // methods are called.

networkCall.enqueue(object : Callback {
    override fun onResponse(call: Call, response: Response) {
        println("Result from network: ${response.body()?.results?.size}")
    }

    override fun onFailure(call: Call, t: Throwable) {

    }
})

// ==========================================================================