Kotlin Retrofit的response.body()返回了null。

3

我正在尝试使用端点https://someURL.com/switching-product/switch?orderID=A001获取API。

是从Postman中看到的返回JSON格式。 因此,我在NetworkConfig.kt类中使用此接口来获取此端点:

//Endpoint: https://someURL.com/switching-product/switch?orderID=A001

interface getOutstandingOrderDetail{
    @GET("switch")
    fun getOutstandingOrderDetail(@Query("orderID") orderID: String): Call<OutstandingOrderDetailPOJODataClassData>
}

并将其存储在此数据类中(由生成POJO的Android扩展程序生成):

data class OutstandingOrderDetailPOJODataClass(

    @field:SerializedName("data")
    val data: OutstandingOrderDetailPOJODataClassData? = null,

    @field:SerializedName("error")
    val error: Error? = null
)

data class OutstandingOrderDetailPOJODataClassData(

    @field:SerializedName("Header")
    val header: OutstandingOrderDetailPOJODataClassHeader? = null,

    @field:SerializedName("Detail")
    val detail: List<OutstandingOrderDetailPOJODataClassDetailItem?>? = null
)

data class OutstandingOrderDetailPOJODataClassHeader(

    @field:SerializedName("buyer_address")
    val buyerAddress: String? = null,

    @field:SerializedName("total_price")
    val totalPrice: Int? = null,

    @field:SerializedName("buyer_name")
    val buyerName: String? = null,

    @field:SerializedName("status_confirmed_yn")
    val statusConfirmedYn: String? = null,

    @field:SerializedName("order_date")
    val orderDate: String? = null,

    @field:SerializedName("outlet_id")
    val outletId: String? = null,

    @field:SerializedName("nip")
    val nip: String? = null,

    @field:SerializedName("jumlah_product")
    val jumlahProduct: Int? = null,

    @field:SerializedName("last_update")
    val lastUpdate: String? = null,

    @field:SerializedName("phone_number")
    val phoneNumber: String? = null,

    @field:SerializedName("order_running_id")
    val orderRunningId: Int? = null,

    @field:SerializedName("status_tagged_yn")
    val statusTaggedYn: String? = null,

    @field:SerializedName("order_id")
    val orderId: String? = null
)

data class OutstandingOrderDetailPOJODataClassError(

    @field:SerializedName("msg")
    val msg: String? = null,

    @field:SerializedName("code")
    val code: Int? = null,

    @field:SerializedName("status")
    val status: Boolean? = null
)
data class OutstandingOrderDetailPOJODataClassDetailItem(

    @field:SerializedName("item_price_new")
    val itemPriceNew: Int? = null,

    @field:SerializedName("item_name_new")
    val itemNameNew: String? = null,

    @field:SerializedName("total_price")
    val totalPrice: Int? = null,

    @field:SerializedName("item_price")
    val itemPrice: Int? = null,

    @field:SerializedName("item_name")
    val itemName: String? = null,

    @field:SerializedName("status_refund")
    val statusRefund: String? = null,

    @field:SerializedName("detail_id")
    val detailId: Int? = null,

    @field:SerializedName("procode_new")
    val procodeNew: String? = null,

    @field:SerializedName("refund_date")
    val refundDate: String? = null,

    @field:SerializedName("request_refund")
    val requestRefund: String? = null,

    @field:SerializedName("procode")
    val procode: String? = null,

    @field:SerializedName("last_update")
    val lastUpdate: String? = null,

    @field:SerializedName("item_qty_new")
    val itemQtyNew: Int? = null,

    @field:SerializedName("order_id")
    val orderId: String? = null,

    @field:SerializedName("total_price_new")
    val totalPriceNew: Int? = null,

    @field:SerializedName("item_qty")
    val itemQty: Int? = null,

    @field:SerializedName("refund")
    val refund: Int? = null
)

这是一个代码片段,我在其中获取URL数据:
private fun fetchOrderedItemListData() {
    NetworkConfig()
        .getOutstandingDetailOrderedItemListService()
        .getOutstandingOrderDetailOrderedItemList("A001")
        .enqueue(object :
            Callback<OutstandingOrderDetailPOJODataClassData> {

            override fun onFailure(
                call: Call<OutstandingOrderDetailPOJODataClassData>,
                t: Throwable
            ) {
                Log.i("Order", "It Failed!!")

                if (call.isCanceled) {
                    Toast.makeText(
                        (activity as AppCompatActivity),
                        "Request Aborted",
                        Toast.LENGTH_SHORT
                    ).show()

                } else {
                    Toast.makeText(
                        (activity as AppCompatActivity),
                        t.localizedMessage,
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }

            override fun onResponse(
                call: Call<OutstandingOrderDetailPOJODataClassData>,
                response: Response<OutstandingOrderDetailPOJODataClassData>
            ) {

                Log.i("Order", "Ordered Item FEtched -> \n ${response.body()}") <= This is for debugging purpose

                binding.rvOrderedItemList.adapter =
                    response.body()
                        ?.let { OrderedItemListAdapter(it, this@OrderDetailFragment) }

                binding.rvOrderedItemList.layoutManager =
                    LinearLayoutManager((activity as AppCompatActivity))

            }
        })
}

如上所示,我使用Log.i尝试在LogCat中打印response.body(),但是它在LogCat中返回null。你可以在这里看到。
我是否漏掉了什么?如果有任何关于这个问题的细节我遗漏了,请随时问我。

你能分享一下你从Postman得到的API响应吗?仅凭看你的POJO类,我无法真正验证。 - Clint Paul
那个来自Postman的?我已经将它附加到上面的超链接中了。就在接口片段之前。 - dimas hermanto
1
但是在Log Cat中返回了null。 body()正在返回一个OutstandingOrderDetailPOJODataClassDataOutstandingOrderDetailPOJODataClassDataheaderdetail属性为null。这表明您的JSON与您的类不匹配。也许你的Retrofit函数应该返回一个OutstandingOrderDetailPOJODataClass而不是一个OutstandingOrderDetailPOJODataClassData,因为这样更符合您的JSON格式。 - CommonsWare
所以我不能直接访问 OutstandingOrderDetailPOJODataClassData 或者什么的吗?没关系,伙计。你的解决方案有效。谢谢!你应该写下答案,这样可以帮助其他用户在未来解决类似问题。 - dimas hermanto
请注意,您需要使用“@”符号来将您的评论发送到某人的收件箱。默认情况下,这里的评论只会发送到您的收件箱(除了您自己的评论,它们不会发送到任何人的收件箱)。我之所以看到您的评论,是因为我特意回到这个问题来检查它。 - CommonsWare
1个回答

1
你的Retrofit函数设置如下:

    @GET("switch")
    fun getOutstandingOrderDetail(@Query("orderID") orderID: String): Call<OutstandingOrderDetailPOJODataClassData>

Call<OutstandingOrderDetailPOJODataClass> 中的数据类型需要与您的JSON匹配。您有与您的JSON匹配的数据类... 但该层次结构的根是 OutstandingOrderDetailPOJODataClass,而不是 OutstandingOrderDetailPOJODataClassData。因此,请将您的Retrofit函数更改为:

    @GET("switch")
    fun getOutstandingOrderDetail(@Query("orderID") orderID: String): Call<OutstandingOrderDetailPOJODataClass>

由于后端的意外更改可能导致主体为空,我们不希望应用程序因NPE而崩溃,因此我们是否应该使用可空版本的模型响应声明我们的“Call”? - JCarlosR
@JCarlosR:我想你可以尝试一下。我不认为null会被解析为JSON,而且我期望你会得到某种异常而不是null响应,至少默认情况下是这样的。你可能可以创建一个Retrofit插件来改变这种行为。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接