Могу ли я указать объект с @SerializedName в его параметрах как @Field в POST-запросе с кодировкой URL?

#api #kotlin #retrofit

#API #kotlin #доработать

Вопрос:

Возьмите следующий JSON, который я хочу отправить в API:

 {
    "param1": "1",
    "param2": "2",
    "param3": {
        "param3-1": "3-1",
        "param3-2": "3-2"
    }
}
  

И мой объект для param3:

 data class param3Object(
    @SerializedName("param3-1") param3_1: String,
    @SerializedName("param3-2") param3_2: String
)
  

Возможно ли передать вышеупомянутый объект в атрибут запроса API @Field:

 
@FormUrlEncoded
@POST("api/something")
fun doSomething(
    @Field("param1") param1: String, 
    @Field("param2") param2: String,
    @Field("param3") param3: param3Object
): Call<MyResponse>
  

чтобы он представлял JSON в верхней части этого сообщения? Или мне нужно индивидуально передавать параметры как @Field? Я пытаюсь придумать способы не тратить время на шаблонную обработку.

Ответ №1:

Вы должны использовать его как REQUEST BODY

 @POST("api/something")
fun createUser(@Body data: Data) : Call<MyResponse>
  

и определить модель

 data class Data(
    @SerializedName("param1") val param1: String,
    @SerializedName("param2") val param2: String,
    @SerializedName("param3") val param3: SubData
)

data class SubData(
    @SerializedName("param3-1") val param3_1: String,
    @SerializedName("param3-2") val param3_2: String
)
  

Редактировать

Если вы действительно хотите отправить это как formUrlEncoded, то, вероятно, простым решением будет изменить параметр3 на string и сериализовать данные перед тем, как поместить их в метод, или, что еще лучше, изменить все на один параметр и сериализовать весь объект

Комментарии:

1. Спасибо. Мне просто было интересно, поскольку я уже пробовал теги @Body и получал ошибки кодирования нескольких частей. Я на самом деле написал это, но не проверял, скептически отнесся и заменил его, лол.

2. так что просто попробуйте удалить @FormUrlEncoded и сделать это способом REST, отправив данные в виде тела json. Или, если вы действительно хотите это сделать, как @FormUrlEncoded вы могли бы исправить ошибку, которую вы получили?

3. Честно говоря, на мой взгляд, не лучшая идея отправлять json в формате formUrlEncoded, как правило, многие примеры показывают использование только с примитивами — строками, числами, логическими значениями

4. Я обновил свой ответ, удалив formurlencoded и указав какой-то способ сделать это с помощью этой аннотации