#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
Переменная aHashMap
. Вам нужно, чтобы значение 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>