以嵌套 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)
}
})
我需要 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)
}
})