REST API дизайн с представлениями администратора - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть приложение API с конечными точками:

/api/v1/accounts
/api/v1/accounts/id

API имеет авторизацию с ролями (пользователь, администратор). Пользователи могут пометить учетные записи как видимые или скрытые. Если учетная запись скрыта, то она не видна в поиске (/api/v1/accounts), но необходимо разрешить поиск администратора в «режиме пользователя» (где скрыты скрыты) и «режиме администратора» (где скрыты тоже видны). Пользователь может видеть свою учетную запись, даже если она помечена как скрытая

Как лучше всего это сделать? Добавить параметр, чтобы определить, является ли он admin для каждой конечной точки или создать отдельные конечные точки? (например, /api/v1/accounts и /admin/api/v1/accounts). Если я использую шаблон-посредник, нужно ли делать отдельные запросы / команды для администратора (единый принцип ответственности) или держать в одном? Я ищу лучшее решение моей проблемы

1 Ответ

1 голос
/ 18 февраля 2020

Это очень самоуверенный вопрос, поэтому ни один ответ не будет полным или единой точкой правды. Я пишу это, потому что информации слишком много, чтобы поместиться в разделе комментариев, и я думаю, что мог бы дать вам несколько хороших рекомендаций, чтобы принять лучшее решение для вас.

Я также буду express своего собственного мнения, поэтому вы должны иметь это в виду.

При этом, прежде всего, я вижу, что вы используете . NET -Core и C#, который описывает один из вариантов, которые у вас есть. Поскольку, по крайней мере, ASP. NET MVC 3 , у нас есть возможность использовать областей , что, я думаю, даст вам поведение, которое вы хотите, используя. NET вроде говорить. Вы можете прочитать о областях в. NET Core здесь и вот короткая цитата:

Рассмотрите возможность использования областей в проекте, когда:

  • Приложение состоит из нескольких функциональных компонентов высокого уровня, которые могут быть логически разделены.
  • Вы хотите разделить приложение так, чтобы каждая функциональная область могла работать независимо.

Итак, плюсы таковы:

  • Вы получаете из коробки маршрутизацию в виде / admin / accounts /...
  • В будущем, если вам понадобится добавить дополнительные функции администратора, вы можете легко разделить их, что сделает ваш код чище и проще в обслуживании

Однако я лично не большой поклонник этого подходить. Сначала это кажется немного искусственным для меня. Обычно у вас получается дублированный код на 95% и небольшие корректировки, и в конце очень сомнительно, что дополнительный код, который вам нужно поддерживать, оправдывает преимущества, которые вы получаете от этого дополнительного разделения.

Возможно, области жизнеспособные варианты в конце концов, но только если у вас есть достаточно много функций, которые вы можете заключить в него, чтобы получить реальную выгоду.

Заключение : Вы можете, и если вы решите прибегнуть к решению / admin / accounts /... Я советую вам рассмотреть вопрос об использовании района, но лично я бы не стал go.

Второй вариант Вы не можете слишком усложнять проект и просто предоставить несколько дополнительных маршрутов для удовлетворения ваших конкретных c потребностей. Проблем с этим несколько, я обрисую их в общих чертах:

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

Событие, хотя вы не обязаны делать свои сервисы RESTful, было бы полезно, если вы будете следовать некоторым ограничениям, которые применяются REST.

Во-первых, запрос должен быть без сохранения состояния:

Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для понимания запроса

В другом По словам всех тех логик c, которые вы описываете в своем вопросе, запрос должен содержать данные, которые понадобятся серверу для возврата правильного ответа. В более практическом плане я говорю о чем-то вроде JWT , где вы можете Claims передать эту дополнительную информацию о пользователе, чтобы сервер мог получить вам правильные данные.

Второй, Унифицированный интерфейс :

REST определяется четырьмя интерфейсными ограничениями: идентификация ресурсов; манипулирование ресурсами через представления; информативные сообщения; и гипермедиа как двигатель состояния приложения.

В вашем случае, я думаю, это самое важное ограничение идентификация ресурсов Чтобы получить нужный ресурс, вам на самом деле не нужна административная часть, это часть бизнес логики c вашего Приложение, которое может видеть всю информацию, необходимую серверу для получения правильных данных, должно быть внутри запроса, а не URI.

Заключение : Я думаю, что вам следует расширить свой запрос с некоторыми дополнительными данными, чтобы позволить серверу выполнить бизнес-логику c и сохранить маршруты такими, как они есть сейчас.

HOWEVER Как вы можете видеть, такие вещи, как области, существуют и люди в Microsoft гораздо лучше, чем я, и вы - разработчики API, поэтому здесь нет чёрно-белого ответа.

Надеюсь, по крайней мере, мне удалось дать вам пищу для размышлений.

...