【问题标题】:Kotlin API call using Retrofit使用 Retrofit 的 Kotlin API 调用
【发布时间】:2018-04-11 06:18:58
【问题描述】:

我是 Kotlin、Android 和 OOP 的新手(自然 ADABAS 背景,从未接触过 Java、C++ 等),所以我非常绝望。

我有一个 API,它的数据看起来像这样,一组书籍详细信息:

API 数据示例

我对数据模型感到困惑。我知道它应该看起来像 API 中的数据并返回一个数组,但我究竟如何在 Kotlin 中对其进行编码?然后我该如何解析它?我已经阅读了一些教程,但它们都不同。有些使用对象,有些使用类。

我也可能通过将所有内容都放在主要活动中来打破一些标准,但我还没有达到那部分。

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query

class MainActivity : AppCompatActivity()

 {

private val api: RestAPI = RestAPI()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)


    val apiGetBooks = api.getBooksList("token123123123")
    val response = apiGetBooks.execute()


    if (response.isSuccessful) {
        val books = response.body()?.title
        println(books)

    } else {
        println("error on API") // What do I do?
    }

}

object  Model {
    val ResultArray : MutableList<BookProperties>? = null
}

data class BookProperties (val id: Int,val title: String, val coverURI: String, val pageURI: String, val pageCount: Int, val languageId: Int,val  description: String, val isFree: Boolean) {
}

private val buriApi: MainActivity.BooksAPI? = null

class RestAPI {
    private val buriApi: BooksAPI

    init {
        val retrofit = Retrofit.Builder()
                .baseUrl("https://api.someurl.com")
                .addConverterFactory(MoshiConverterFactory.create())
                .build()

        buriApi = retrofit.create(BooksAPI::class.java)
    }

    fun getBooksList(token: String): Call<BookProperties>{
        return buriApi.getBooks(token)
    }
}

fun getBooksList(token: String): Call<MainActivity.BookProperties> {
    return buriApi!!.getBooks(token)
}

interface  BooksAPI {
    @GET("/v1/books")
    fun getBooks (@Query("token")token: String) : Call<BookProperties>
}
}

【问题讨论】:

    标签: android api kotlin retrofit2


    【解决方案1】:

    经过多次谷歌搜索,感谢 YouTube 上的How to Quickly Fetch Parse JSON with OkHttp and Gson,我终于解决了我的问题。

        fun fetchBooks () {
        println("fetching books")
    
         val url = "https://api.someurl.com/v1/books?"
        val request = Request.Builder().url(url).build()
    
        println(request)
        val client = OkHttpClient()
    
        client.newCall(request).enqueue(object: Callback {
            override fun onResponse(call: Call?, response: Response?) {
                val body = response?.body()?.string()
                println(body)
            }
    
            override fun onFailure(call: Call?, e: IOException?) {
                println("Failed to execute request")
                e?.printStackTrace()
            }
        })
    }
    

    仍然需要格式化数据并弄清楚如何在我的 Android 模拟器中打开 wifi,但至少我可以使用 JSON。

    【讨论】:

      【解决方案2】:

      让我们从一个示例开始,我想您可以根据自己的要求对其进行映射。

      我没有你的 JSON 作为文本,所以我举一个我的例子。

      示例 JSON 响应

          {
           "status": true,
           "message": "User created Successfully.",
           "response": {
           "user": {
           "id": 12,
           "email": "testmail@gmailtest.com"
          },
           "token": "eyJlbWFpbCI6ImVzaGFudHNhaHUxMTBAZ21hc2kyMmwuY29tIiwidXNlcklkIjoxNSwiaWF0IjoxNTIxNTYyNjkxfQ"
          }
         }
      

      所以创建一个新类并将其命名为这样

      CreateResponse.kt 并将这些对象和数组从 json 映射到数据类并在此处列出。

      data class CreateUserResponse(override val status: Boolean? = null,
                                        override val message: String? = null,
                                        val response: Response? = null) 
      
      data class Response(val user: User?, val token: String)
      
      data class User(val id: Int, val email: String)
      

      很简单,现在使用 Kotlin,您可以声明数据类,而无需每次为每个对象创建单独的文件,只需创建一个文件并一次性声明所有文件。

      我在这里附上了一些资源,可以帮助您更好地理解这些内容。

      https://antonioleiva.com/retrofit-android-kotlin/

      https://segunfamisa.com/posts/using-retrofit-on-android-with-kotlin

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 2021-08-19
        • 2020-03-28
        • 2019-03-17
        • 2021-05-18
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多