我在项目中使用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
方法的主体,这样我们就可以检查它(如果上面的解决方案不起作用(。