reforming@Body将给定的Body数据转换为数组



我在项目中使用retrofit2进行网络调用。对于post方法,我需要传递请求正文数据。所以决定使用@Body注释。这转换了给定的Gson。JsonObject到数组,如下所述。使用对依赖项进行改装

//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.7.2'

预期

{
"key1": "value1",
"key2": "value2",
"key3": value3
}

但像一样被转换了

[{
"key1": "value1",
"key2": "value2",
"key3": value3
}]

这是我的API服务调用

@Headers("Content-Type: application/json")
@POST("Account/LoginAsync")
fun doLogin(@Body payLoad: JsonObject): Call<JsonObject>

数据类为

data class LoginRequest(
val email: String,
val password: String,
val rememberMe: Boolean
)

在内部,我正在做的是

根据LoginRequest中的指定值生成org.json.JSONObject,如下所示

private fun generateLoginPayload(
email: String,
password: String,
rememberMe: Boolean
): JSONObject {
return JSONObject().apply {
put(LOGIN_EMAIL, email)
put(LOGIN_PASSWORD, password)
put(LOGIN_REMEMBER_ME, rememberMe)
}
}

然后

val payload = generateLoginPayload(email, password, rememberMe)
val requestCall = ApiService.create()
.doLogin(JsonParser().parse(payload.toString()) as JsonObject)

在排队之后,请求调用得到错误响应为400(坏请求(。

我已经从调试值中进行了检查。可能的原因是什么?

解决方案1

如果您试图将包含电子邮件、密码和rememberMe选项的json有效载荷发送到Account/LoginAsync端点,则不需要generateLoginPayload函数。

首先,将API服务函数重构为如下内容:

@Headers("Content-Type: application/json")
@POST("Account/LoginAsync")
fun doLogin(@Body payLoad: LoginRequest): Call<JSONObject>

然后更新有效载荷

val payload = LoginRequest(email, password, rememberMe)
val requestCall = ApiService.create().doLogin(payload)

溶液2

如果您真的想在请求体中使用JSONObject对象,则无需将payload对象转换为字符串,只需稍后使用JsonParser将其转换回JSONObject即可。只需将代码的最后一部分更新为:

val payload = generateLoginPayload(email, password, rememberMe)
val requestCall = ApiService.create().doLogin(payload)

我不熟悉JsonParser对象。如果它是一个自定义类,请还包括parse方法的主体,这样我们就可以检查它(如果上面的解决方案不起作用(。

最新更新