Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Динамическое изменение аргумента интерфэйса Retrofit2

#java #android #retrofit2


Есть метод для изменения услуги:

    @Multipart
    @PUT("/api/edit/service/{service_id}/{master_id}")
    Observable editService(@Path("service_id") String serviceId,
                                     @Path("master_id") String userId,
                                     @Part MultipartBody.Part avatar,
                                     @Part("title") RequestBody title,
                                     @Part("price") RequestBody price,
                                     @Part("description") RequestBody description,
                                     @Part("period") RequestBody periodInMinutes,
                                     @Part("service_category") RequestBody serviceCategory) 


в котором я должен отправлять то поле которое изменилось, либо все поля, включая
изменившееся поле. То есть в выше написанном методе я отправляю все поля.

Но я хочу отправлять только то поле, которое изменилось, типа так:

Observable editService(@Path("service_id") String serviceId,
                                     @Path("master_id") String userId,
                                     @Part("title") RequestBody title)


Только в данном случае я отправляю я отправляю измененный заголовок, так как в аннотации
@Part прописал ключ заголовка - @Part("title"). 
Таким образом мне придется для каждого поля создать отдельный метод. Мне кажется
это не правильно.

Так вот, возможно ли отправлять все измененные поля с ключами, а в методе editService()
прописать типа:

Observable editService(@Path("service_id") String serviceId,
                                     @Path("master_id") String userId,
                                     @Part RequestBody service)


Может есть решение как скомпоновать поля в один?
    


Ответы

Ответ 1



Решил задачу с помощью @PartMap В RetrofitServiceApi: @Multipart @PUT("/api/edit/service/{service_id}/{master_id}") Observable editService(@Path("service_id") String serviceId, @Path("master_id") String userId, @PartMap Map params); И отправляю: String image = serviceModel.getImage(); String title = serviceModel.getTitle(); String description = serviceModel.getDescription(); String period = serviceModel.getPeriod(); int price = serviceModel.getPrice(); if (!tmpServiceClick.getImage().equals(image)) { parameters.putAll(RetrofitRequestUtil.fileToRequestBodyMap(file, "avatar")); } if (!tmpServiceClick.getTitle().equals(title)) { parameters.put("title", RetrofitRequestUtil.toRequestBody(title)); } if (!tmpServiceClick.getDescription().equals(description)) { parameters.put("description", RetrofitRequestUtil.toRequestBody(description)); } if (!tmpServiceClick.getPeriod().equals(period)) { parameters.put("period", RetrofitRequestUtil.toRequestBody(period)); } if (tmpServiceClick.getPrice() != price) { parameters.put("price", RetrofitRequestUtil.toRequestBody(String.valueOf(price))); } retrofitInterface.editService(masterId, serviceModel.getPublicId(), parameters)) Класс RetrofitRequestUtil: public static RequestBody toRequestBody(String value) { return RequestBody.create(MediaType.parse("text/plain"), value); }

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

Отправить комментарий