Лучшие практики REST API для доступа к собственным объектам - PullRequest
0 голосов
/ 27 мая 2020

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

Я не собираюсь когда-либо позволять пользователю (даже модератору) публиковать записи в чужой журнал.

Тем не менее, есть ли какие-либо аргументы для раскрытия идентификатора учетной записи или журнала в моем пути к конечной точке?

Я бы подумал, что POST api/journals/postEntry будет достаточно, поскольку я могу определить пользователь через токен доступа или токен JWT.

Может ли кто-нибудь придумать аргументы для предоставления journalId в пути? Пример: POST api/journals/{user journalId}/postEntry

1 Ответ

1 голос
/ 27 мая 2020

Может ли кто-нибудь придумать аргументы в пользу предоставления journalId в пути? Пример: POST api / journals / {user journalId} / postEntry

Короткий ответ: это нарушение единого ограничения интерфейса.

См. Fielding, 2000 .

То, что вы делаете, по сути, создает этот маленький уголок мира, где вместо использования target-uri для идентификации ресурса вы вместо этого используете target-uri + token.

Это означает, что ваша вещь не использует семантику, которую ожидают компоненты общего назначения в мире.

Например, когда я копирую URI из своего пользовательского агента и делюсь им с кем-то в противном случае этот другой человек не получает ожидаемого результата - они в конечном итоге смотрят свое представление, а не мое.

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

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

НА ПРАКТИКЕ: вы используете HTTP, а HTTP имеет правила кеширования, которые запрещают совместное использование аутентифицированных запросов. Таким образом, упомянутые выше проблемы кеширования являются чисто теоретическими.

Альтернативы, которые вы можете рассмотреть

  • Вы можете организовать перенаправление с /api/journals/postEntry на с на /api/journals/{userJournalId}/postEntry
  • Вы можете использовать заголовок Content-Location , чтобы указать, что для текущего представления существует более конкретный c идентификатор.
  • Вы можете использовать каноническую ссылку отношение , чтобы помочь клиентам перейти к предпочтительному ресурсу из альтернатив.
...