Java Retrofit2 POST JsonObject хорошая практика? - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу работать с REST API в моем приложении Java.Для своих звонков я использую retrofit2.Часто мне нужно POST-объекты, которые мне нужны только один раз, поэтому я спрашиваю себя, действительно ли мне нужно добавить дополнительный класс.

(например, UserCreate), просто чтобы создавать новые ресурсы (потому что часто я получаюсовершенно разные объекты, чем мне нужно для создания ресурса одного типа)

Альтернатива - использовать com.google.gson.JsonObject для этой ситуации.Это позволяет мне создавать объекты Json, которые не нуждаются в дополнительном классе.

Например:

JsonObject obj = new JsonObject();
obj.addProperty("foo", "bar");
Call<Something> call = caller.createSomething(obj);
  • Считается ли использование JsonObject «хорошей практикой» здесь?Есть ли лучшая альтернатива, чем создание нескольких классов?

  • Совершенно ли я ошибаюсь, и создание отдельного класса - лучший способ сделать то, что я хочу?

  • Я теряю производительность при использовании JsonObject?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Этот вопрос не действителен только для Retrofit2.Я ежедневно работаю с Spring и JAX-RS, и иногда я спрашиваю себя, было ли хорошей идеей создавать все эти простые (ну, иногда они становятся довольно сложными) классы.

В любом случае, естьне универсальный ответ на это.Разработчики имеют разные вкусы и предпочтения, когда речь идет о разработке API, как на стороне клиента, так и на стороне сервера.

Однако, имея класс Java, описывающий тело запроса или тело ответа формат довольно полезен.Если эти классы соблюдают соглашение об именах (например, добавление *Request или *Response), если они собраны в определенных значимых пакетах, они со временем облегчат жизнь вашим коллегам.

Использование классов Java означает повышение надежности интерфейсов API, поскольку компилятор поможет вам найти проблемы при кодировании.С другой стороны, используя нетипизированный JsonObject (или любой объект, предоставленный библиотекой Json, которую вы будете использовать), вам нужно быть более осторожным.

Использование Javaклассы вы также можете использовать полиморфизм и строительные модели.Вы можете кодировать по интерфейсам, а не по конкретным объектам.

Некоторые службы, которые предоставляют API-интерфейсы для внешнего мира, могут также предоставлять вам файлы Jar, содержащие предварительно скомпилированные классы, для включения в ваш путь к классам.


Отвечая на ваш третий пункт, построение JsonObject вручную с использованием Gson и его отправка с помощью RequestBody не влечет за собой снижения производительности.Помните, что при использовании Java DTO s в качестве @Body, существует процесс сериализации, о котором заботится Gson.Возможно также, что построение JsonObject s лучше с точки зрения производительности.

0 голосов
/ 17 февраля 2019

Зачастую мне нужно POST-объекты, которые мне нужны только один раз, поэтому я спрашиваю себя, действительно ли мне нужно добавить дополнительный класс.

Ваш вопрос может вызвать мнение, основанное на мненииответы ... Но в любом случае я стараюсь подчеркнуть несколько - надеюсь, не имеющих мнения - баллов.Во-первых, что вы достигнете, если решите создать JsonObject вместо определения класса DTO для ваших данных?

Я имею в виду, если у вас был DTO вроде:

@AllArgsConstructod
FooBarDTO {
    String foo;
    Integer age;
}

, а затем использовать егонапример:

Call<Something> call = caller.createSomething(new FooBarDTO("bar",42));

На самом деле создание этого класса DTO не стоит слишком дорого, но дает такие вещи, как:

  • тип безопасного создания экземпляра DTO легко
  • если вам позже понадобится изменить то, что вам не обязательно взламывать логику на стороне клиента и сервера (когда дело доходит до создания JsonObject), возможно, вам просто нужно немного изменить DTO.

Таким образом, ваш UserCreateDTO должен был бы хорошо разобрать материал.Вы бы сэкономили усилия и поддержку кода, который бы выполнял что-то вроде:

user.setAge( jsonObject.getAsInt("age") ):

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

user.setAge(dto.getAge());

Альтернатива - использовать com.google.gson.JsonObject для этой ситуации.Это позволяет мне создавать объекты Json, которые не нуждаются в дополнительном классе.

Да, но это требует некоторых других вещей, когда ваш сервер анализирует данные.Затем вам нужно будет обработать некоторые детали, например, получить свойство и узнать во время разбора, является ли оно int, string, array of somehting.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...