【问题标题】:Retrofit2 Add extra string to Body objectRetrofit2 向 Body 对象添加额外的字符串
【发布时间】:2017-11-02 18:32:36
【问题描述】:

基本上我想做的就是这个。

首先这是我的APIService.kt

@Headers("Content-Type: application/json")
    @POST("api/v1/UsuarioController/saveDataPerson")
    abstract fun saveDataPerson(@Body email: String,@Body Person: Person): Call<Person>

错误与 email: String 有关在我的 Person.kt

中创建相同价值的电子邮件

结构是这样的

Person.kt

class Person : Serializable {
    var user: User
    var imc: String
    var name: String
    var gender: Boolean
    var age: Int
    var height: Float
    var weight: Float

    @SerializedName("message")
    var message: String? = null

    constructor(user: User,imc: String, name: String, gender: Boolean, age: Int, height: Float, weight: Float){
        this.user = User
        this.imc = imc
        this.name = name
        this.gender = gender
        this.age = age
        this.height = height
        this.weight= weight
    }
}

这是我调用电子邮件的另一个类(用于登录、注册)

User.kt

class Usuario() : Serializable {
    var rol: String = ""
    var email: String = ""
    var pass: String = ""
    var active: Boolean = false

    @SerializedName("message")
    var message: String? = null

    constructor(rol: String, email: String, pass: String, active: Boolean): this(){
        this.rol = rol;
        this.email = email;
        this.pass = pass;
        this.active = active;
    }

}

以及执行此操作的类。

private fun registerPersonalData(){
        btnBMI.isClickable = false
        btnBMI.startAnimation()
        val person = restManager!!.getApiService()!!.saveDataPerson(Person(User("rol",commonMethod.getUserPreferenceValue(),"password",true),commonMethod.categoryBMI(commonMethod.calcBMI(commonMethod.calcHeightMeters(et_height.text.toString().toFloat(),heightRadioSelect.position.toString().toInt()),commonMethod.calcWeightKilograms(et_weight.text.toString().toFloat(),weightRadioSelect.position.toString().toInt()))),et_name.text.toString(),genderRadioSelect.position.toString().toBoolean(),age.toInt(),et_height.text.toString().toFloat(),et_weight.text.toString().toFloat()))
        person.enqueue(object : Callback<Person> {
            override fun onResponse(call: Call<Person>, response: retrofit2.Response<Person>) {
                when(response.body()?.message){
                    "Empty Fields"->Toast.makeText(this@RegisterBMIActivity,getString(R.string.invalid_data),Toast.LENGTH_LONG).show()
                    "No linked account"->Toast.makeText(this@RegisterBMIActivity,getString(R.string.no_associated_account),Toast.LENGTH_LONG).show()
                    "No IMC linked"->Toast.makeText(this@RegisterBMIActivity,getString(R.string.bmi_unknown),Toast.LENGTH_LONG).show()
                    "Invalid data"-> Toast.makeText(this@RegisterBMIActivity,getString(R.string.invalid_data),Toast.LENGTH_LONG).show()
                    "Success"->registroExitoso()
                    else -> Toast.makeText(this@RegisterBMIActivity,getString(R.string.unknown_error),Toast.LENGTH_LONG).show()
                }
                btnBMI.isClickable = true
                btnBMI.doneLoadingAnimation(R.color.md_yellow_300, (BitmapFactory.decodeResource(resources,R.drawable.check)))
            }
            override fun onFailure(call: Call<Person>, t: Throwable) {
                Log.e("error", t.message)
                btnBMI.isClickable = true
                btnBMI.revertAnimation()
            }
        })
    }

我想要实现的目标是将 email 添加到我的@Body 中,而不将该字段添加到 Person.kt

请给我建议:(

[[编辑]]

这是 JSON Fail 时抛出的新内容...

E/error: java.lang.IllegalStateException: 预期 BEGIN_OBJECT 但 是 STRING 在第 2 行第 1 列路径 $

E/errors:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为 BEGIN_OBJECT,但在第 2 行第 1 列路径 $

【问题讨论】:

    标签: android kotlin retrofit retrofit2


    【解决方案1】:

    一个调用可以有 1 个主体参数。
    只有 1 个。

    因此您必须创建一个新类,例如扩展“User”类的“RequestUser”,然后在该类中添加“email”字段。

    因此,您在应用程序中使用“用户”类,但是当您想要发出请求时,您创建一个新的“RequestUser”对象,该对象从“用户”对象复制所有数据,并将电子邮件添加到“ RequestUser" 对象,并使用它来执行请求。

    另外,请用英文编写您的代码。当您的代码有一半是其他语言时,您就无法阅读。

    【讨论】:

    • 好吧,我也将代码更改为英文(我的错),当我扩展 User 类时,我得到一个格式错误的异常,但是我无法可视化我发送和接收的 JSON :(跨度>
    【解决方案2】:

    问题在于,当您调用要分配的对象时,它与您正在接收的当前结构不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多