Запрос на доработку с несколькими параметрами в kotlin работает некорректно

#android #kotlin

#Android #kotlin

Вопрос:

Мой код в интерфейсе Api:

  interface APIServiceUpdateTeam {
    @FormUrlEncoded
    @PUT("/api/v1/updateTeam/{Id}/")
    suspend fun updateTeam(@Path("Id")teamId: String,
                           @Header("Authorization") token: String,
                           @FieldMap params: 
            HashMap<String?,ArrayList<*>>): Response<ResponseBody>,
    
   }
  

// мой код вызова запроса

 val params = HashMap<String?, ArrayList<*>>()
params.put("members",teamMemberListToUpdate)
params.put("name",teamIdToAdd)
params.put("password", passwordTeamAdd)


val response =
    service.updateTeam(teamIdToAdd.toString(),"Token ${token}", params) 
  

// Таким образом, запрос post / put состоит из 2 строк (имя и пароль) и 1 массива целых чисел, входящих в его примерные элементы. В моем примере здесь HashMap представляет собой массив целых чисел, поэтому имя и пароль не принимаются.

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

1. вы тестировали api со своими параметрами?

2. да, iam поступает из swift, и API работает нормально. Проблема заключается в сочетании в запросе массива (элементов) и строки (имя и пароль).

3. «Token $ {token}», вы уверены, что авторизация начинается с «Token»?

4. да, это не проблема. Проблема в том, что у меня есть 3 параметра, 1 массив и 2 строки. Чего я не знаю, так это как передать 3 разных вида параметров в запросе (массив и строка)

Ответ №1:

Если я правильно понимаю, вы хотите указать тип значения как тип Any

 val params = HashMap<String?, Any>()
params.put("members",teamMemberListToUpdate)
params.put("name",teamIdToAdd)
params.put("password", passwordTeamAdd)
  

Таким образом, вы можете поместить разные типы в map

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

1. Я думаю, это не работает, потому что имя и пароль параметров не являются хэш-картой, а просто строкой. Param Members представляет собой массив Int

2. params Переменная a HashMap . Вам нужно, чтобы значение HashMap также было HashMap?

3. API хочет получить список в качестве входных данных для членов параметров (его фреймворк django rest)

4. Можете ли вы опубликовать спецификацию api?

5. api требуется имя, пароль и участники. Имя — это строка, пароль — это строка, а члены — это массив членов. Я пришел из swift, где работает точно такой же запрос. Там я использую alamofire. В alamofire я могу просто указать параметры и их тип.

Ответ №2:

вы не должны менять пароль таким образом, вам нужно сделать его отдельно от PUT. вы можете сделать свой put следующим образом :

  @Headers(
        "Content-Type: application/json"
    )
    @PUT("/api/v1/updateTeam/{id}")
    suspend fun modify(
        @Header("Authorization") authorization: String,
        @Path("id") id: String,
        @Body team: Team,
    ): Response<ResponseBody>
  

или

 @FormUrlEncoded
@PUT("/api/v1/updateTeam/{id}")
  suspend fun modify(
      @Header("Authorization") authorization: String,
      @Path("id") id: String,
      @Field("membres") member: List<Any>,
      @Field("name") name: String,
  ): Response<ResponseBody>