REST API для пользовательских профилей с разными атрибутами

#rest

#отдых

Вопрос:

Я пытаюсь создать REST API для профилей пользователей на автомобильном веб-сайте. В моем случае в каждом профиле пользователя есть автомобиль, который в зависимости от марки может иметь разные атрибуты.

Прямо сейчас я фиксирую запрос POST на /profiles/{profile_name} . Ниже приведен пример полезной нагрузки json

 {
    "car_brand" : "BMW",
    "car_data" : {
        "engine_size" : "2.0L",
        "top_speed" : 200
        ...
        "special_bmw_attribute" : "bmw logo color"
    }
}

 

Как только запрос попадает в мой серверный сервер, я проверяю car_brand значение и создаю Car объект, вызывая соответствующий конструктор car с данными из car_data . Затем я создаю UserProfile объект с profile_name и, который имеет созданный автомобиль в качестве атрибута. Наконец, я сохраняю этот UserProfile объект в своей базе данных.

Является ли это надежным подходом, или есть лучший или более простой способ? Каких подводных камней мне следует опасаться? У меня ограниченный опыт работы с REST API, и я хотел бы знать, двигаюсь ли я в правильном направлении.

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

1. Ваш вопрос касается не API, а модели данных. Поделитесь с вами структурой базы данных и диаграммой классов, и мы посмотрим, возможны ли какие-либо оптимизации. После того как вы разработаете модель, вы можете адаптировать REST API к ней, а не наоборот.

2. Да, я вижу, что вопрос немного расплылся. В основном интересно, являются ли ключи car_brand и связанные с ними ключи car_data типичным способом размещения различных атрибутов. Я думал, вы адаптировали API с учетом удобства использования, а не внутренней логики. Извините, если я вас неправильно понял.

3. Ну, я имел в виду, что если за вашей реализацией и скрываются какие-то подводные камни, то они кроются в модели, а не в API. Говоря об API, я думаю, вы ответили на свой вопрос: если его можно использовать только с точки зрения клиента, тогда все в порядке. Подумайте, однако, об извлечении атрибутов, общих для всех брендов (engine_size, top_speed и т.д.), В отдельный объект. Все остальные предпочтительно рассматривать как карту вспомогательных атрибутов.