Я разрабатываю свой первый API-интерфейс RESTful, который (к сожалению) выполняется в уже существующей системе, и идея состоит в том, чтобы разрешить третьим сторонам доступ к этой системе.
Все было хорошо, пока я не понял, что у меня есть несколько способов доступа к одним и тем же ресурсам. Я попытаюсь объяснить это, используя одну из частей системы. Система была построена с использованием Laravel 5.8 и имеет, среди прочего, следующие таблицы базы данных:
- пользователи
- электронные письма
- смс
Каждый пользователь может иметь много электронных писем, и каждое электронное письмо принадлежит только одному пользователю. То же самое относится и к текстовым сообщениям.
Я «проигнорировал» весь текущий код, потому что он не был построен должным образом, чтобы сделать его RESTful API, поэтому я создал новую папку Api
и весь мой код там есть.
Я думал, что было бы целесообразно иметь следующие конечные точки
/api/v1/users
/api/v1/users/1
/api/v1/users/1/emails
/api/v1/users/1/emails/1
/api/v1/users/1/sms
/api/v1/users/1/sms/1
Таким образом, я могу получить список пользователей, получить все подробности пользователя, получить список сообщений электронной почты / текстовых сообщений, а также получить все детали определенного c сообщения электронной почты / текстового сообщения. Однако одним из требований является наличие страницы со списком сообщений электронной почты / текстовых сообщений, поэтому имеет смысл иметь:
/api/v1/emails
/api/v1/emails/1
/api/v1/sms
/api/v1/sms/1
Чтобы не иметь 2 конечных точек для получения одного и того же ресурса (/api/v1/users/1/emails/1
и /api/v1/emails/1
вернут письмо с идентификатором 1) Я собираюсь избавиться от глубоких конечных точек /api/v1/users/1/emails
и изменить их на что-то вроде /api/v1/emails?user_id=1
.
Это противоречит принципам RESTful? Я не смог прийти к выводу о том, что у меня есть две конечные точки для доступа к одному и тому же ресурсу, но это «не правильно». С другой стороны, наличие /api/v1/emails?user_id=1
может вызвать некоторые проблемы безопасности / конфиденциальности (например, мне нужно убедиться, что пользователь 1 может получить доступ только к /api/v1/emails?user_id=1
, а не /api/v1/emails?user_id=2
), но кажется более гибким, потому что я могу его использовать один для получения всех ресурсов или с помощью фильтра user_id для получения только указанных c ресурсов.
Существует ли соглашение для этого случая?