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

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

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

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

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

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

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #2

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

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

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

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

      אבייא תגובה 1 תגובה אחרונה
      1
      • yossizY yossiz

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

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

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

        אבייא מנותק
        אבייא מנותק
        אביי
        כתב ב נערך לאחרונה על ידי אביי
        #3

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

        :;}{][()
        

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

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

        אבייא תגובה 1 תגובה אחרונה
        0
        • אבייא אביי

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

          :;}{][()
          

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

          אבייא מנותק
          אבייא מנותק
          אביי
          כתב ב נערך לאחרונה על ידי
          #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
          • דף הבית
          • קטגוריות
          • פוסטים אחרונים
          • משתמשים
          • חיפוש
          • חוקי הפורום