Передать данные в запросе можно несколькими способами:
- Как часть адреса
- В query-параметрах адреса
- В кукис
- В кастомных http-хэдерах
- В теле запроса
В первом и втором случае параметры видны в адресе, что одновременно является и плюсом и минусом. Что выбрать — зависит от ваших целей. Например, адрес проще скопировать сразу со всеми параметрами, что может быть полезно для отладки. Если вы отправляете запрос через curl или из кода, то принципиальной разницы нет.
Никто не мешает вам передавать идентификатор сущности где хотите, просто это будет уже другой стиль, а не REST. В REST API традиционно принято соглашение, по которому адрес должен указывать на конкретную сущность. В хэдерах при этом может передаваться информация для аутентификации или настройки (например, часовой пояс), а в query-параметрах какие-то дополнительные параметры конкретного запроса, не указывающие непосредственно на сущность (например, режим сортировки или поисковая строка).
Примеры:
- /posts/123/ - адрес сущности с id=123
- /posts - адрес списка сущностей
- /posts?sort=asc - всё ещё REST, список сущностей с опционной сортировкой
- /posts - внезапно не список, а конкретная сущность, id которой передается в хэдерах, не REST
Ещё один аргумент, почему id должна быть рядом с адресом — стремление к большей связности (cohesion). Если мы где-то указываем id сущности, то любой вменяемый разработчик ожидает увидеть там же и её тип. А тут получается у нас тип указан в урле (/posts) а id внезапно надо искать в хэдере. Это станет лишним усложнением при отладке кода.