Отправить сложный объект с помощью Retrofit2 - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь отправить сложный объект в качестве параметра моего запроса, используя Retrofit2 и Kotlin. Структура этого объекта следующая:

{
  "id": "..."
  "token": "..."
  "message": "..."
  "list1": [
    { "id": 1, "value": 2 },
    { "id": 2, "value": 5 }
    //and so on...
  ]
  "list2": [
    { "id": 10, "value": 16 },
    { "id": 11, "value": 21 }
    //and so on...
  ]
  //and so on...
}

Количество полей списка равно различных (может быть 2 списка, может быть 10), а также количество элементов в каждом списке , Для этого я использую следующий код, предварительно заполнив мою Карту соответствующими значениями:

@JvmSuppressWildcards
@FormUrlEncoded
@POST("get_data.php")
fun getResponse(
    @FieldMap params: Map<String, Any>
): Observable<ResponseModelResult>

По какой-то причине этот подход не работает должным образом, и сервер просто игнорирует мои параметры. Я также пытался отправить их как @Body строка / объект, но кажется, что сервер принимает только данные, кодированные FormUrlEnE .

Может кто-нибудь дать мне пример, как я должен отправлять такие данные в качестве параметра с использованием подхода @FieldMap?

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020

вместо @ FieldMap вы можете использовать @ Field , как показано ниже.

@ JvmSuppressWildcards @FormUrlEncoded @POST ("get_data. php") fun getResponse (@Field ( "ваш ключ" ) jsonObject: String): наблюдаемый

Передать объект json как строку.

0 голосов
/ 20 апреля 2020

Наконец-то я нашел решение. Похоже, что дооснащение не может работать с картой <String, Any>, поэтому самым простым способом было бы отправить параметры запроса аналогично, например, в Postman.

val params = mutableMapOf<String, String>()
params["id"] = ...
params["token"] = ...
params["message"] = ...

params["list1[0][id]"] = "${1}"
params["list1[0][value]"] = "${2}"
params["list1[1][id]"] = "${2}"
params["list1[1][value]"] = "${5}"

params["list2[0][id]"] = "${10}"
params["list2[0][value]"] = "${16}"

//and so on

Затем в моем ApiService :

@Headers("Content-Type: application/x-www-form-urlencoded")
@FormUrlEncoded
@POST("get_data.php")
fun getResponse(
    @FieldMap params: Map<String, String>
): Observable<ResponseModelResult>

Возможно, это не лучший подход в целом, но, по крайней мере, он работает для меня.

0 голосов
/ 20 апреля 2020

YЕсли вы предоставите демонстрационный URL-адрес вашего API или документации или что-то еще, что поможет мне более детально выяснить проблему c, тогда я обновлю свой ответ в соответствии с вашим механизмом API, теперь вы можете попробовать это:

Объявите ваш интерфейс API следующим образом:

    @POST("get_data.php") 
    fun getResponse(@Query("params") params: String): Observable<ResponseModelResult>

Создайте свой сложный объект следующим образом:

    val jsonObject1 = JsonObject().apply {
        addProperty("id", 1)
        addProperty("value", 1)
    }

    val jsonObject2 = JsonObject().apply {
        addProperty("id", 2)
        addProperty("value", 2)
    }

    val list1 = JsonArray().apply {
        add(jsonObject1)
        add(jsonObject2)
    }

    val jsonObject10 = JsonObject().apply {
        addProperty("id", 10)
        addProperty("value", 16)
    }

    val jsonObject11 = JsonObject().apply {
        addProperty("id", 11)
        addProperty("value", 21)
    }

    val list2 = JsonArray().apply {
        add(jsonObject10)
        add(jsonObject11)
    }

    val params = JsonObject().apply {
        addProperty("id", "...")
        addProperty("token", "...")
        addProperty("message", "...")
        add("list1", list1)
        add("list2", list2)
    }.toString()

Теперь вы готовы к go, вызовите ваш API-интерфейс, передавая params как параметр запроса, например: getResponse(params)

...