Search code examples
androidapikotlinretrofitspotify

Spotify API - Client Credentials Flow in Kotlin with Retrofit doesnt work


I am trying to use Spotify API. To use the API i need to get a new auth token. So per their guides here, I wrote the code below to request for a new token:

enter image description here

this is my API interface

@FormUrlEncoded
    @POST("api/token")
    fun getToken(@Header("Authorization") auth:String,
                 @Header("Content-Type") content :String,
                 @Field(("grant_type")) grantType:String ): Call<Token>

this is my MainActivity:

val retrofit: Retrofit = Retrofit.Builder().baseUrl(TOKEN_URL)
            .addConverterFactory(GsonConverterFactory.create()).build()
        val service :TopTrackApi = retrofit.create(TopTrackApi::class.java)

        val base64String = "Basic " +  get64BaseString("6bcfc9a9fccd45c8b9bb9c980f03e653:96c65e1824084adfb1ae99ef97734621")

        Log.i("64Base ", base64String)
        val listCall : Call<Token> = service.getToken(base64String,"application/x-www-form-urlencode","client_credentials")

        listCall.enqueue(object : Callback<Token>{
            override fun onResponse(response: Response<Token>?, retrofit: Retrofit?) {
                if (response?.body() != null) {
                Log.i("Response!", response.body().access_token)
                }
                if(response?.body() == null){
                    Log.i("Response!", "null response body")
                }
            }
            override fun onFailure(t: Throwable?) {
                Log.e("Error", t!!.message.toString())
            }
        })

fun get64BaseString(value:String):String{
        return Base64.encodeToString(value.toByteArray(),Base64.NO_WRAP)
    }

This is the token class as per their json object: enter image description here

data class Token(
    val access_token: String,
    val expires_in: Int,
    val token_type: String
)

As a result I get this in Logcat:

I/Response: null response body

edit:When i am running the same values in a curl command it works(it returns the json object)

What am I doing incorrect? Thanks in advance.


Solution

  • I think your API interface should look like this:

    @Headers("Content-Type: application/x-www-form-urlencoded")
    @POST("api/token")
        fun getToken(@Header("Authorization") auth:String,
                     @Field(("grant_type")) grantType:String ): Call<Token>