У меня общий вопрос о том, как лучше всего создать API, который может изменять записи в базе данных.
Предположим, у нас есть таблица с 10 столбцами, и мы можем запросить эти 10 столбцов с помощью REST (GET). Ответ JSON будет содержать все 10 полей. Это просто и работает без проблем.
Следующим шагом является то, что кто-то хочет создать новую запись через POST. В этом случае человек отправляет только 8 из 10 полей в запросе JSON. Затем мы заполним только 8 полей в базе данных (остальные будут NULL). Это также работает без проблем.
Но что произойдет, если кто-то захочет обновить запись? Мы видим здесь различные возможности с преимуществами и недостатками.
Отправляется только то, что должно быть обновлено. Проблема: Как вы можете явно очистить / удалить поле? Если в JSON передается «NULL», мы получаем NULL в объекте, но любое другое поле, которое не было передано, также равно NULL. Поэтому мы не можем различить guish, какое поле может быть удалено, а какое поле не может быть затронуто.
Полный объект отправлен. Проблема: Здесь объект может быть получен через GET раньше, изменен соответствующим образом и возвращен через PUT. Теперь мы получаем всю информацию и можем записать ее обратно в базу данных. Потому что пустые поля либо были ранее пустыми, либо были очищены пользователем.
Что происходит, если объекты расширяются обновлением API. Предположим, мы расширили базу данных еще на пять полей. Пользователь API делает GET, получает 15 полей, но может прочитать только 10 полей, которые он знает на своей странице (потому что он еще не обновил свою сторону). Затем он меняет некоторые из 10 полей и отправляет их обратно через PUT. Затем мы обновим только 10 полей на нашем сайте, и 5 новых полей будут удалены из базы данных.
Или вам нужно создать отдельную конечную точку для каждого поля? Мы также подумали о создании карты с ключом / значением, что именно должно быть изменено.
О технике: Мы используем Wildfly 15 with Resteasy and Jackson
.
Например:
База данных в начале
+----+----------+---------------+-----+--------+-------+
| ID | Name | Country | Age | Weight | Phone |
+----+----------+---------------+-----+--------+-------+
| 1 | Person 1 | Germany | 22 | 60 | 12345 |
| 2 | Person 2 | United States | 32 | 78 | 56789 |
| 3 | Person 3 | Canada | 52 | 102 | 99999 |
+----+----------+---------------+-----+--------+-------+
GET ... / person / 2
{
"id" : 2,
"name" : "Person 2",
"country" : "United States",
"age" : 22,
"weight" :62,
"phone": "56789"
}
Теперь я хочу обновить свой вес и убрать номер телефона
PUT ... / person / 2
{
"id" : 2,
"name" : "Person 2",
"country" : "United States",
"age" : 22,
"weight" :78
}
или
{
"id" : 2,
"name" : "Person 2",
"country" : "United States",
"age" : 22,
"weight" :78,
"phone" : null
}
Теперь база данных должна выглядеть следующим образом:
+----+----------+---------------+-----+--------+-------+
| ID | Name | Country | Age | Weight | Phone |
+----+----------+---------------+-----+--------+-------+
| 1 | Person 1 | Germany | 22 | 60 | 12345 |
| 2 | Person 2 | United States | 32 | 78 | NULL |
| 3 | Person 3 | Canada | 52 | 102 | 99999 |
+----+----------+---------------+-----+--------+-------+
Проблема в
Мы расширяем таблицу следующим образом (продажа)
+----+----------+---------------+-----+--------+--------+-------+
| ID | Name | Country | Age | Weight | Salery | Phone |
+----+----------+---------------+-----+--------+--------+-------+
| 1 | Person 1 | Germany | 22 | 60 | 1929 | 12345 |
| 2 | Person 2 | United States | 32 | 78 | 2831 | NULL |
| 3 | Person 3 | Canada | 52 | 102 | 3921 | 99999 |
+----+----------+---------------+-----+--------+--------+-------+
Человек, использующий API, не знает, что в * 1063 есть новое поле * за зарплату. И этот человек сейчас хочет изменить номер телефона кого-то еще раз, но не отправляет зарплату. Это также опустошило бы зарплату:
{
"id" : 3,
"name" : "Person 3",
"country" : "Cananda",
"age" : 52,
"weight" :102,
"phone" : null
}
+----+----------+---------------+-----+--------+--------+-------+
| ID | Name | Country | Age | Weight | Salery | Phone |
+----+----------+---------------+-----+--------+--------+-------+
| 1 | Person 1 | Germany | 22 | 60 | 1929 | 12345 |
| 2 | Person 2 | United States | 32 | 78 | 2831 | NULL |
| 3 | Person 3 | Canada | 52 | 102 | NULL | NULL |
+----+----------+---------------+-----+--------+--------+-------+
И зарплата не должна быть нулевой, потому что она не была установлена внутри JSON запроса