【问题标题】:Retrofit 2 Get Github Users API always returning null改造 2 获取 Github 用户 API 总是返回 null
【发布时间】:2018-12-31 18:41:19
【问题描述】:

我试图从https://github.com/users 获取 json。 我想显示用户名:yehezkiell like https://github.com/yehezkiell。 改造显示成功结果,但始终返回 null。我是这次改造的新手,请帮忙

这是我的代码

 val postService = DataRepository.create()

    postService.getUser("yehezkiell").enqueue(object : Callback<Users>{
        override fun onFailure(call: Call<Users>?, t: Throwable?) {
            Log.e("retrofitnya","gagal ${t}")
        }

        override fun onResponse(call: Call<Users>?, response: Response<Users>?) {
            Log.e("retrofitnya","berhasil")

            val data = response?.body()
            Log.e("retrofitnya","berhasil ${data?.name}")


        }

    })

改造实例

interface RetrofitInstance {

    @GET("users/{username}")
    fun getUser(@Path("username") username:String ): Call<Users>

}

数据仓库

   object DataRepository {
    fun create(): RetrofitInstance {
        val retrofit = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("https://github.com")
                .build()
        return retrofit.create(RetrofitInstance::class.java)
    }
}

Users.kt

open class Users {


    @SerializedName("name")
    @Expose
    open var name: String? = null

    @SerializedName("username")
    @Expose
    open var username: String? = null

    @SerializedName("email")
    @Expose
    open var email: String? = null
}

【问题讨论】:

  • Users 长什么样子? Gson 可能有问题。
  • 仅对用户名、电子邮件和 ID 进行海化
  • 在此处粘贴 log cat stacktrace
  • 没有日志先生,它只是从这里返回 null Log.e("retrofitnya","berhasil ${data?.name}")
  • 如果你声明 Users 类只包含 username 并且它实际上有一个 name 属性,这可能是配置错误。还有一个问题:data 也为空吗?

标签: api kotlin retrofit github-api


【解决方案1】:

对于调试过程,不是在响应后立即反序列化为Users 对象,我们应该这样做吗? :

  1. 首先将其反序列化为纯字符串。
interface RetrofitInstance {

    @GET("users/{username}")
    fun getUser(@Path("username") username: String): Call<String>

}
  1. 只需记录该字符串即可显示我们真正得到的结果。
override fun onResponse(call: Call<String>?, response: Response<String>?) {
    val responseBody = response?.body() ?: ""
    Log.e("retrofitnya","response body as string = ${responseBody}")
}
  1. (如果我们想在此之后将其用作Users)手动反序列化它。
val user: Users = Gson().fromJson(responseBody, Users::class.java)

如果不是太机密,请告诉我们您如何声明 Users 数据对象,例如,这个 Foo 和 Bar。

data class Foo(
    @SerializedName("bar") val bar: Bar?
)

data class Bar(
    @SerializedName("name") val name: String?
)

【讨论】:

  • 你可以看到我的用户类
  • 然后,我尝试了您的解决方案,但它仍然给我 null。这是我的日志 12-31 17:17:35.193 3564-3564/com.example.yehezkiel.retrofitboilerplate E/retrofitnya: berhasil 12-31 17:17:35.194 3564-3564/com.example.yehezkiel.retrofitboilerplate E/retrofitnya: response body as string = null 一件事,我也试图捕捉响应代码。它向我展示了 404
  • 哦...在仔细查看我们的“URL”之后,我猜您正在尝试从 GitHub REST API 获取一些东西,而不是从 github [dot] com 获取 Html 数据。 〜我会在下一条评论中告诉你。〜
  • 好吧,没有必要再展示了,因为你找到了那个点:)。
【解决方案2】:

我自己解决了这个问题,实际上这是我愚蠢的错误理解,即终点是错误的。

In my wrong code
   object DataRepository {
    fun create(): RetrofitInstance {
        val retrofit = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("https://github.com")
                .build()
        return retrofit.create(RetrofitInstance::class.java)
    }
}

那个错误的终点是

https://github.com 

真实的是

https://api.github.com/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 2021-10-28
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多