Retrofit-非空主体上的onFailure,空主体上的onResponse

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit-非空主体上的onFailure,空主体上的onResponse相关的知识,希望对你有一定的参考价值。

我的GET请求在android Studio中无法正常工作。我试图在邮递员中提出相同的请求,结果我总是得到带有正确正文的响应代码200。但是,使用Retrofit时,当响应主体为空(没有数据)时,我会收到onResponse(200代码),而当响应主体不为空(有一些保留)时,我会得到onFailure。

编辑:我刚刚在日志中注意到这样的错误:Expected BEGIN_OBJECT but was STRING at line 1 column 22 path $[0].reservationDate

EDIT2:JSON响应

[
    {
        "reservationDate": "2019-10-30",
        "id": "4"
    }
]

API服务:

    @Headers("Authorization: Bearer ...")
    @GET("reservations")
    fun getSchedule(@Query("id") id: Int,
                    @Query("reservationDate") reservationDate: LocalDate

    ):  Call<List<ScheduleModel>>


    companion object {
        fun create(): ScheduleService{

            var retrofit = Retrofit.Builder()
                .baseUrl("myUrl")
                .addConverterFactory(GsonConverterFactory.create())
                .build()

            return retrofit.create(ScheduleService::class.java)
        }
    }
}
data class ScheduleModel(
    val id: Int,
    val reservationDate: LocalDate
)
fun getReservations() {
        var service = ScheduleService.create()
        var localdate = LocalDate.of(2019,10,30)

        var call = service.getSchedule(4, localdate)

        call.enqueue(object : Callback<List<ScheduleModel>> {

            override fun onResponse(call: Call<List<ScheduleModel>>, response: Response<List<ScheduleModel>>) {
                if (response.code() == 200) {
                    Toast.makeText(applicationContext, "It's ok", Toast.LENGTH_SHORT).show()
                }
            }

            override fun onFailure(call: Call<List<ScheduleModel>>, t: Throwable) {
                Toast.makeText(applicationContext, "Failure", Toast.LENGTH_SHORT).show()
            }
        })
    }

我的GET请求在Android Studio中无法正常工作。我试图在邮递员中提出相同的请求,结果我总是得到带有正确正文的响应代码200。但是,使用翻新我得到...

答案

您的'id'和'reservationDate'在响应中是一个字符串,但是您尝试将其解析为Int和LocalDate。更改类型,它将起作用。

以上是关于Retrofit-非空主体上的onFailure,空主体上的onResponse的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Retrofit 中将 InputStream 作为请求的主体发布?

如何使用 Retrofit 2 + OkHttp 3 加密/隐藏 HTTPS 调用的主体?

Retrofit2 OkHttp3 响应正文空错误

Retrofit 中的 Enqueue 方法不会在 Fragment 中加载数据

改进请求的通用基本方法

解决:Retrofit请求返回: Expected a string but was BEGIN_OBJECT at line 1 column 4832 path $