有没有办法通过@Body而不是多个@Field传递参数

时间:2019-09-03 09:30:02

标签: android kotlin retrofit2 httpresponse

我有一个后端服务器,想用主体参数进行Http POST调用。

我创建一个带有API密钥的@Header和带有用户信息的@Body的Post请求。但是,当我按下api时,作为响应,它会显示类似“ data”:[]的响应,而它应该类似于“ data”:{}。但是,如果我发送多个@Field作为参数,它将很不错。有没有使用@Body而不是多个@Field

的过程?

SignInInfo.kt

data class SignInInfo(
    @SerializedName("name") val name: String,
    @SerializedName("email") val email: String,
    @SerializedName("user_type") val userType: String,
    @SerializedName("phone") val phone: String,
    @SerializedName("password") val password: String
)

api.kt

@POST(Constants.API_USER_REGISTRATION)
fun registerUser(
    @Body signInInfo: SignInInfo
): Call<RegistrationResponse>

api.kt

@FormUrlEncoded
@POST(Constants.API_USER_REGISTRATION)
fun registerUser(
    @Field("name") name: String,
    @Field("email") email: String,
    @Field("user_type") user_type: String,
    @Field("phone") phone: String,
    @Field("password") password: String
): Call<RegistrationResponse>

使用@Field参数时我得到了这个预期的答案

{
    "status": 1,
    "data": {
        "id": 135386,
        "user_id": 1567057386,
        "token": "geYs2rO6wjtO653I9OVhJWTFwYxAvnYnLGG7wm7dfa"
    },
    "msg": "Welcome Aomi"
}

使用@Body参数时得到了这个意外的答案

{
    "status": 2,
    "data": [],
    "msg": "Failed"
}

2 个答案:

答案 0 :(得分:1)

您的Body数据类应如下所示

data class Body(
    @SerializedName("status")
    val status: Int? = 0,
    @SerializedName("data")
    val `data`: Data? = Data(),
    @SerializedName("msg")
    val msg: String? = ""
)

data class Data(
        @SerializedName("id")
        val id: Int? = 0,
        @SerializedName("user_id")
        val userId: Int? = 0,
        @SerializedName("token")
        val token: String? = ""
)

如果您想获得这种json

{
    "status": 1,
    "data": {
        "id": 135386,
        "user_id": 1567057386,
        "token": "geYs2rO6wjtO653I9OVhJWTFwYxAvnYnLGG7wm7dfa"
    },
    "msg": "Welcome Aomi"

和用法

@POST(Constants.API_USER_REGISTRATION)
fun registerUser(
    @Body signInInfo: Body
): Call<RegistrationResponse>

答案 1 :(得分:0)

是的,您可以这样做

    @POST(Constants.API_USER_REGISTRATION)
    fun generateOTPForgotPassword(@Body signInInfo: SignInInfo): Call< RegistrationResponse>

就像你一样。