以嵌套 json 格式在 kotlin 中使用 retrofit2 发送数据

send data with retrofit2 in kotlin in nested json format

我需要 post 具有嵌套 Json 的数据,如下面的屏幕所示(请参阅 "user",然后是数据)

{
  "user" : 
  {
    "email": "xxxxx",
    "password" : "surabaya1234"
  }
}

目前我的改造正在使用这种格式

{
  "email": "xxxxx",
  "password" : "surabaya1234"  
}

这是我的改造客户端

object RetrofitClient {
    private const val BASE_URL = "http://X.X.X.X"

    private val okHttpClient = OkHttpClient.Builder()
        .addInterceptor { chain ->
            val original = chain.request()
            val requestBuilder = original.newBuilder()
                .addHeader("Authorization", token)
                .method(original.method(), original.body())
            val request = requestBuilder.build()
            chain.proceed(request)
        }.build()

    val instance: Api by lazy {
        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build()

        retrofit.create(Api::class.java)
    }
}

这是我的 buttonListener,它在按下时发送数据

binding.buttonSignUp.setOnClickListener {
  val email = editTextEmail.text.toString().trim()
  val phoneNumber = editTextPhone.text.toString().trim()
  val password = editTextPassword.text.toString().trim()
  val passwordConfirmation = editTextPassword.text.toString().trim()
  if (email.isEmpty()) {
      editTextEmail.error = "Email Required"
      editTextEmail.requestFocus()
      return@setOnClickListener
  }
  RetrofitClient.instance.createUser(email, password, phoneNumber).enqueue(object: Callback<User>{
      override fun onFailure(call: Call<User>, t: Throwable) {
          toast = Toast.makeText(activity,"Not OK",Toast.LENGTH_LONG)
      }
      override fun onResponse(call: Call<User>, response: Response<User>) {
          toast = Toast.makeText(activity,"Sukses",Toast.LENGTH_LONG)
      }

  })

这是界面

interface Api {
    @FormUrlEncoded
    @POST("users")
    fun createUser(
        @Field("email") email:String,
        @Field("password") password:String
    ):Call<User>
}

我该如何更改我的代码可能接口,以便它可以像上面的示例一样以嵌套 json 格式发送数据,这可能是简单的答案,但我是 kotlin 的新手/java

如果你想随心所欲地发送数据,试试这个。

interface Api {
    @FormUrlEncoded
    @POST("users")
    fun createUser(
        @FieldMap HashMap<String, Object> param
    ):Call<User>
}

并添加发送改造的地图。

val hashMap = HashMap()
hashMap.put("user", sendData) //make sendData String from json
val responseBodyCall = RetrofitConnectionAPI.setConnect().createUser(hashMap)

ps。制作 JSONObject

val jsonData = JSONObject()
jsonData.put("email", email)   // inputed email
jsonData.put("password", password) // inputed password
val sendDate = jsonData.toString()

您也可以创建模型并将模型传递给改造,它会自动为您完成工作。

根据 json 结构创建模型。

public class UserLogin {

 @SerializedName("user")
 @Expose
 private User user;

 public User getUser() {
 return user;
 }

 public void setUser(User user) {
 this.user = user;
 }

}

public class User {

 @SerializedName("email")
 @Expose
 private String email;
 @SerializedName("password")
 @Expose
 private String password;

 public String getEmail() {
 return email;
 }

 public void setEmail(String email) {
 this.email = email;
 }

 public String getPassword() {
 return password;
 }

 public void setPassword(String password) {
 this.password = password;
 }

}

更改您的 api 界面

interface Api {
    @POST("users")
    fun createUser(
        @Body userLogin : UserLogin
    ):Call<User>
}

并且在进行 api 调用时就这样调用。

//create a user login model and set the data, and pass it in below method
 RetrofitClient.instance.createUser(userLogin).enqueue(object: Callback<User>{
      override fun onFailure(call: Call<User>, t: Throwable) {
          toast = Toast.makeText(activity,"Not OK",Toast.LENGTH_LONG)
      }
      override fun onResponse(call: Call<User>, response: Response<User>) {
          toast = Toast.makeText(activity,"Sukses",Toast.LENGTH_LONG)
      }

  })