Search code examples
androidkotlinmvvmretrofit2dagger-hilt

Retrofit returns 200 response code but I'm receiving null when accessing fields


I'm using retrofit to make a network request to an API. The response code returns 200 but I am receiving null when trying to access the fields. I have checked out other solutions but can't seem to solve my problem. I am using hilt

Here is my API class

interface BlockIOApi{

   @GET("/api/v2/get_balance/")
   suspend fun getBalance(
   @Query("api_key")
   apiKey: String = BuildConfig.API_KEY
   ): Response<BalanceResponse>
}

and here is my app module object

AppModule

@Module
@InstallIn(ApplicationComponent::class)
object AppModule{
@Singleton
@Provides
fun provideOkHttpClient() = if (BuildConfig.DEBUG) {
    val loggingInterceptor = HttpLoggingInterceptor()
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
    OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .build()
} else OkHttpClient
    .Builder()
    .build()


@Provides
@Singleton
fun providesRetrofit(okHttpClient: OkHttpClient): Retrofit =
    Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(BASE_URL)
        .client(okHttpClient)
        .build()

@Provides
@Singleton
fun providesApiService(retrofit: Retrofit): BlockIOApi = retrofit.create(BlockIOApi::class.java)

}

And finally here is my repositories, DefaultRepository.kt

class DefaultRepository @Inject constructor(
private val blockIOApi: BlockIOApi,
private val balanceDao: BalanceDao
):BlockIORepository {
override suspend fun getBalance(): Resource<BalanceResponse> {
  return try {
      val response = blockIOApi.getBalance()
      Log.d("TAG", "getBalance>>Response:${response.body()?.balance} ")
      if (response.isSuccessful){
          response.body().let {
              return@let Resource.success(it)
          }
      }else{
          Log.d("TAG", "getBalance: Error Response >>> ${response.message()}")
          Resource.error("An unknown error occured",null)
      }
  }catch (ex :Exception){
      Resource.error("Could not reach the server.Check your internet connection",null)
  }
}

and this interface,BlockIORepository.kt

interface BlockIORepository {
suspend fun getBalance(): Resource<BalanceResponse>
suspend fun insertBalance(balance: Balance)
suspend fun getCachedBalance(): Balance
suspend fun getAddresses(): Resource<DataX>
}

Here are my data classes

data class BalanceResponse(
val balance: Balance,
val status: String

)

@Entity
data class Balance(
    val available_balance: String,
    val network: String,
    val pending_received_balance: String,
    @PrimaryKey(autoGenerate = false)
    var id: Int? = null
)

enter image description here The problem comes when I try to access the data object. I am not getting null for the status object I have been stuck on this for two days now. Any help will be highly appreciated. Thanks in advance.


Solution

  • The problem is occured here:

    data class BalanceResponse(
       val balance: Balance,  <-- in postman it is "data"
       val status: String
    )
    

    You should consider putting @SerializedName(xxx) for your class.

    data class BalanceResponse(
       @SerializedName("data") val balance: Balance, 
       val status: String
    )