Я буду вторым Романом из комментариев. Существует несколько различных интерпретаций REST, но когда речь идет конкретно о «чистейшем», обычно я думаю, что вам нужно смотреть в сторону сервиса HATEOAS / Hypermedia, согласно первоначальному определению.
Это определение довольно слабое, потому что оно не устанавливает точный контракт о том, как должна выглядеть привязка с HTTP, но обычно принято, что URI должны обнаруживаться с помощью следующих ссылок, а не через внеполосную информацию. Клиенты не должны действительно жестко кодировать шаблоны URI, и есть несколько механизмов, которые особенно помогают при поиске (например, шаблонные ссылки HAL).
Итак, эти абзацы отвечают на ваш вопрос буквой, а теперь давайте ответим на то, что вы, вероятно, хотите знать: что такое элегантный дизайн URI для вашей конкретной задачи, который является предсказуемым и вменяемым с точки зрения разработки API.
Первое, что я хотел бы спросить: зачем вам вообще нужна форма 'id'?
http://myserver/api/account/123
123
- это некрасивый ключ и бессмысленный вид, если у вас нет прямого доступа к базе данных. Звучит так, как будто есть отношение 1: 1 к вашей «мнемонике», почему бы вообще не отбросить числовую форму и всегда использовать естественный ключ.
Это выглядит намного лучше, и устраняет проблему дублирования за один раз. Если это не вариант (возможно, не у каждой сущности есть «мнемоника»), и у вас должно быть 2 места для доступа к ресурсу, я думаю:
?query=x
подсказывает мне, что это поиск, который может вернуть от 0 до n
ресурсов в виде коллекции. Я бы лично избегал этого из-за уникальных, уникальных ресурсов. Это не действие , действие по-прежнему GET
, поэтому для поиска это было бы хорошо.
Это оставляет /api/account/mnemonic/EmergingMarkets
, хотя лично я бы поместил его в другое пространство имен, как /api/account
. Поскольку api/account
выглядит как коллекция, в которой все учетные записи являются участниками, api/account/mnemomic
может выглядеть как другая учетная запись. Это говорит мне о том, что существуют две различные структуры, такие как:
/api/account/id/123
/api/account/mnenomic/EmergingMarkets
Или:
/api/account/123
/api/account-by-mnenomic/EmergingMarkets
Во всяком случае, первая часть моего ответа была тем, о чем вы спрашивали, и основывалась на фактах, вторая часть - это ответ, который я думаю вы хотите, но, очевидно, полностью основанный на мнении. Спросите еще 5 человек, и вы, по крайней мере, получите несколько разных ответов.
Бонус
Если у вас есть 2 одинаковых ресурса, размещенных по 2 разным URL, есть несколько разных способов сказать клиентам, что они действительно одно и то же:
- Попросите 1 сделать перманентное перенаправление (
308
) к другому.
- Подайте ваш документ на оба сайта и используйте ссылку
canonical
, чтобы указать, что есть каноническое место для получения информации.
- Используйте заголовок
Content-Location
, чтобы сделать то же самое.