בעיה בRetrofit באנדרואיד (kotlin)
-
אני כותב אפליקציית אנדרואיד שמתקשרת עם שרת api, האפליקציה שולחת בקשות עם פרמטרים, והשרת מגיב בjson וכאן משום מה הRetrofit נתקע ומחזיר שגיאה
Expected a string but was BEGIN_OBJECT $ at line 1 column 2 path
מחיפוש בגוגל מצאתי שזה בעיה מוכרת, אבל לא הצלחתי ליישם אף אחד מהפתרונות שהובאו כאן וכאן,הגדרתי בקובץ
ApiService.kt
package com.abaye.myapplication import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Url interface ApiService { @GET fun fetchData(@Url url: String): Call<String> }
ובקובץ
RetrofitClient.kt
package com.abaye.myapplication import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory object RetrofitClient { private const val BASE_URL = "https://api.abaye.co/" val apiService: ApiService by lazy { Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService::class.java) } }
וככה אני משתמש
private fun login(value1: String, callback: LoginCallback) { val url = "pter?value1=$value1" val call = RetrofitClient.apiService.fetchData(url) call.enqueue(object : Callback<String> { override fun onResponse(call: Call<String>, response: Response<String>) { if (response.isSuccessful) { val result = response.body() showTextBubble(result.toString()) } else { callback.onFailure("Error: ${response.code()}") } } override fun onFailure(call: Call<String>, t: Throwable) { showTextBubble("Error: ${t.message}") binding.textView2.setText(t.message.toString()) callback.onFailure("Error: ${t.message}") } }) }
והonFailure מופעל וזורק את השגיאה לעיל.
יצויין כי תגובת שרת הAPI תקינה לגמרי, וכן כשחוזר טקסט רגיל זה עובד פיקס.
-
@yossiz זה השאלה איך אני יכול לגרום לו לפרשן את זה כמחרוזת בכל מקרה? זה בעצם מה שאני צריך, אבל גרשיים לא עוזרות.. ברגע שכללתי אחד מהתווים הללו זה נתקע לא משנה היכן בדיוק התו היה ממוקם...
:;}{][()
ניסיתי גם לשנות את הtype של הCall אבל אז הכל השתגע כבר בהידור
-
@אביי כתב בבעיה בRetrofit באנדרואיד (kotlin):
ניסיתי גם לשנות את הtype של הCall אבל אז הכל השתגע כבר בהידור
הפיתרון אכן היה לשנות את הטייפ לטייפ כללי ולהוסיף מחלקת נתונים שתטפל בהמרה לפני שהיא חוזרת אלי (היינו למשתנה שמכיל את התשובה שמוחזרת)
data class ServerResponse( val status: Boolean, val statusAction: String, val token: String, val user: String, val name: String, val message: String, val lastEntry: String, val sumMoney: String )
הטעות של היתה בצורת הקריאה למחלקה במקרה הזה, שצריכה להיות ככה
Call<Response<ServerResponse>>