דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. בעיה בRetrofit באנדרואיד (kotlin)

בעיה בRetrofit באנדרואיד (kotlin)

מתוזמן נעוץ נעול הועבר תכנות
4 פוסטים 2 כותבים 228 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • אבייא מנותק
    אבייא מנותק
    אביי
    כתב ב נערך לאחרונה על ידי אביי
    #1

    אני כותב אפליקציית אנדרואיד שמתקשרת עם שרת 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 תקינה לגמרי, וכן כשחוזר טקסט רגיל זה עובד פיקס.

    ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
    הלינקיה שלי https://abaye.co/link.html

    yossizY תגובה 1 תגובה אחרונה
    0
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב לאביי ב נערך לאחרונה על ידי yossiz
      #2

      @אביי אין לי מושג בקוטלין ו-retrofit אבל ככה נראה מלמעלה שהבעיה פה:

      fun fetchData(@Url url: String): Call<String>
      

      אתה הגדררת ש-fetchData מחזיר (Call של) string ולכן המפרסר (של gson כנראה?) מצפה לגרשיים, בפועל ה-API מחזיר אובייקט

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      אבייא תגובה 1 תגובה אחרונה
      1
      • אבייא מנותק
        אבייא מנותק
        אביי
        השיב לyossiz ב נערך לאחרונה על ידי אביי
        #3

        @yossiz זה השאלה איך אני יכול לגרום לו לפרשן את זה כמחרוזת בכל מקרה? זה בעצם מה שאני צריך, אבל גרשיים לא עוזרות.. ברגע שכללתי אחד מהתווים הללו זה נתקע לא משנה היכן בדיוק התו היה ממוקם...

        :;}{][()
        

        ניסיתי גם לשנות את הtype של הCall אבל אז הכל השתגע כבר בהידור

        ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
        הלינקיה שלי https://abaye.co/link.html

        אבייא תגובה 1 תגובה אחרונה
        0
        • אבייא מנותק
          אבייא מנותק
          אביי
          השיב לאביי ב נערך לאחרונה על ידי
          #4

          @אביי כתב בבעיה ב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>>
          

          ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
          הלינקיה שלי https://abaye.co/link.html

          תגובה 1 תגובה אחרונה
          2

          בא תתחבר לדף היומי!
          • התחברות

          • אין לך חשבון עדיין? הרשמה

          • התחברו או הירשמו כדי לחפש.
          • פוסט ראשון
            פוסט אחרון
          0
          • דף הבית
          • קטגוריות
          • פוסטים אחרונים
          • משתמשים
          • חיפוש
          • חוקי הפורום