【问题标题】:I'm getting null values when making post request retrofit进行发布请求改造时,我得到空值
【发布时间】:2020-10-16 10:40:27
【问题描述】:

我对在 Kotlin 中使用 API 还很陌生,我正在使用 Retrofit 库,但遇到了这个问题 发出 post 请求后获取 null 值。

我正在尝试得到这个回复:

{
  "status": "success",
  "message": "Transfer Queued Successfully",
  "data": {
    "account_number": "0690000040",
    "bank_code": "044",
    "currency": "NGN",
    "amount": 5500
  }
}

我的模型类

data class Transfer (
    @SerializedName("account_bank") val accountBank: String?,
    @SerializedName("account_number") val accountNumber: String?,
    @SerializedName("amount") val amount: Int?,
    @SerializedName("currency") val currency: String?
)

我的 API 接口

interface TransferApi {
    @Headers("Content-Type: application/json")
    @POST("transfers")
    fun createTransfer(@Body transfer: Transfer) : Call<Transfer>
}

XML 文件


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/responseText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

活动类

class MainActivity : AppCompatActivity() {

    private lateinit var transferApi: TransferApi
    private val bankInput = "044"
    private val numberInput = "0690000040"
    private val amountInput = 500
    private val currency = "NGN"

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

        val secret = "SECRET_KEY"

        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(OkHttpClient.Builder().addInterceptor { chain ->
                val request = chain.request().newBuilder().addHeader("Authorization", "Bearer $secret").build()
                chain.proceed(request)
            }.build())
            .build()

        transferApi = retrofit.create(TransferApi::class.java)

        createTransfer()

    }

    private fun createTransfer(){

        val transferCode = Transfer(bankInput,numberInput,amountInput,currency)
        val call = transferApi.createTransfer(transferCode)

        call.enqueue(object : Callback<Transfer> {

            @SuppressLint("SetTextI18n")
            override fun onResponse(call: Call<Transfer>, response: Response<Transfer>) {
                if (!response.isSuccessful) {
                    responseText.text ="Code${response.code()}"
                    return
                }
                responseText.text = response.body().toString()
            }

            override fun onFailure(call: Call<Transfer>, t: Throwable) {
                responseText.text = (t.message)
            }

        })

    }

}

我收到了回复

{
  accountBank = null,
  accoutNumber = null,
  amount = null,
  currency = null
}

我想在上面提出回应。非常感谢您的帮助!!!

【问题讨论】:

    标签: java android kotlin retrofit okhttp


    【解决方案1】:

    您的 Transfer 类似乎不代表实际响应。你需要一个包装器,像这样:

    data class TransferResponse(
        val status: String,
        val message: String,
        val data: Transfer
    )
    

    之后,您需要更改 API 接口以返回此包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 2023-03-14
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多