Существуют ли правила именования для REST API?

158

При создании API REST существуют ли какие-либо рекомендации или стандарты defacto для соглашений об именах в API (например: компоненты пути конечной точки URL, параметры запроса)? Являются ли верблюды правильными или подчеркивают? другие?

Например:

api.service.com/helloWorld/userId/x

или

api.service.com/hello_world/user_id/x

Примечание. Речь идет не о дизайне API RESTful, а скорее о правилах соглашения об именах для использования для возможных компонентов пути и/или параметров строки запроса.

Любые рекомендации будут оценены.

Теги:
naming-conventions
rest

10 ответов

123
Лучший ответ

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

Итак, ваш URL должен выглядеть так (игнорируя проблемы дизайна по вашему запросу: -))

api.service.com/hello-world/user-id/x
  • 179
    Согласно RFC2616, только схема и части хоста URL не чувствительны к регистру. Остальная часть URL, т.е. путь и запрос, ДОЛЖНЫ быть чувствительными к регистру. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
  • 9
    Даниэль, ты прав, спасибо, что указал на это. Однако де-факто мы обычно ожидаем, что URL игнорируют регистры, особенно часть имени ресурса. Для userid & UserId не имело бы смысла вести себя по-разному (если только один из них не возвращает 404)
Показать ещё 7 комментариев
70

API REST для Dropbox, Twitter, Google Web Services и Facebook все использует подчеркивания.

  • 18
    Одним из побочных эффектов этого является то, что подчеркнутые «слова» сохраняются вместе в поисковых индексах Google. Переносимые слова разбиты на отдельные слова.
  • 0
    Пример: dev.twitter.com/docs/api/1.1
Показать ещё 5 комментариев
69

Посмотрите на URI для обычных веб-ресурсов. Это ваш шаблон. Подумайте о деревьях каталогов; используйте простые имена файлов и каталогов, похожие на Linux.

HelloWorld не очень хороший класс ресурсов. Кажется, это не "вещь". Это может быть, но это не очень похоже на существительное. A greeting - вещь.

user-id может быть существительным, которое вы извлекаете. Однако сомнительно, что результатом вашего запроса является только user_id. Скорее всего, результатом запроса является Пользователь. Поэтому user - это существительное, которое вы извлекаете

www.example.com/greeting/user/x/

Имеет смысл для меня. Сосредоточьтесь на том, чтобы сделать ваш запрос REST своего рода именной фразой - путь через иерархию (или таксономию или каталог). Используйте простейшие существительные, избегая при этом существительных фраз.

Как правило, составные существительные-фразы обычно означают еще один шаг в вашей иерархии. Таким образом, у вас нет /hello-world/user/ и /hello-universe/user/. У вас есть /hello/world/user/ и hello/universe/user/. Или, возможно, /world/hello/user/ и /universe/hello/user/.

Цель состоит в том, чтобы обеспечить путь навигации среди ресурсов.

  • 3
    Мой вопрос больше касается соглашения об именовании возможных путей и / или параметров строки запроса, какими бы они ни были. Я согласен с вашими рекомендациями по дизайну, так что спасибо, но с этим вопросом я просто спрашиваю о соглашениях об именах.
  • 1
    Просто отметим, что ничто не мешает вам использовать REST для неиерархических ресурсов. Фактические соглашения об именах URI, которые вы используете, несущественны, просто используйте то, что, по вашему мнению, выглядит хорошо и вам легко разобрать на сервере. Клиент не должен ничего знать о генерации ваших URI, так как вам нужно отправлять URI ресурсам через гипертекст в ваших ответах.
24

"UserId" - это совершенно неправильный подход. Метод Verb (HTTP Method) и Noun - это Roy Fielding, предназначенный для Архитектура REST. Существительные:

  • Коллекция вещей
  • вещь

Одно хорошее соглашение об именах:

[POST or Create](To the *collection*)
sub.domain.tld/class_name.{media_type} 

[GET or Read](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[PUT or Update](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[DELETE](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[GET or Search](of a *collection*, FRIENDLY URL)
sub.domain.tld/class_name.{media_type}/{var}/{value}/{more-var-value-pairs}

[GET or Search](of a *collection*, Normal URL)
sub.domain.tld/class_name.{media_type}?var=value&more-var-value-pairs

Где {media_type} является одним из: json, xml, rss, pdf, png, even html.

Можно выделить коллекцию, добавив в конце 's', например:

'users.json' *collection of things*
'user/id_value.json' *single thing*

Но это означает, что вам нужно отслеживать, где вы положили 's', а где нет. Плюс половина планеты (азиаты для стартеров) говорит на языках без явного множественного числа, поэтому URL-адрес менее дружелюбен к ним.

  • 1
    Рой, а не Роб :)
  • 0
    Что подразумевается под {var}? Если я ищу пользователя по имени, это будет, например, ... / user / username / tomsawyer?
Показать ещё 4 комментария
14

Нет. REST не имеет ничего общего с соглашениями об именах URI. Если вы включите эти соглашения как часть вашего API, вне диапазона, а не только через гипертекст, то ваш API не будет RESTful.

Для получения дополнительной информации см. http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

  • 41
    Отдохни ... все равно приятно иметь красивые URL.
  • 1
    Согласитесь с @HDave, в духе REST очень важно иметь URL, которые легко понять. Вы работаете с URL-адресами, почему вы не хотите, чтобы они были так же легко понятны, как имена переменных и параметров в вашем коде?
Показать ещё 4 комментария
9

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

3

У меня есть список рекомендаций в http://soaprobe.blogspot.co.uk/2012/10/soa-rest-service-naming-guideline.html, который мы использовали в prod. Руководящие принципы всегда дискуссионны... Я думаю, что последовательность иногда важнее, чем совершенствовать вещи (если есть такая вещь).

2

Я не думаю, что случай верблюда является проблемой в этом примере, но я полагаю, что более соглашение об именах RESTful для приведенного выше примера будет:

api.service.com/helloWorld/userId/x

вместо того, чтобы сделать userId параметром запроса (который является совершенно законным), мой пример означает, что ресурс in, IMO, более RESTful.

  • 0
    Речь идет не о разработке API RESTful, а о правилах соглашения об именах, которые следует использовать для возможных компонентов пути и / или используемых параметров строки запроса. В вашем примере компоненты пути должны быть в верблюжьих шапках, как вы использовали, или подчеркивания?
  • 0
    Ну, поскольку в REST ваши URL-адреса являются вашими интерфейсами, то это вопрос API. Хотя я не думаю, что есть какие-либо рекомендации, характерные для вашего примера, я бы остановился на случае с верблюдом.
Показать ещё 3 комментария
1

Я бы сказал, что предпочтительнее использовать как можно меньше специальных символов в URL-адресах REST. Одним из преимуществ REST является то, что он упрощает чтение "интерфейса" для услуги. Случай Верблюда или Паскаль, вероятно, хорош для имен ресурсов (пользователей или пользователей). Я не думаю, что в REST есть какие-то жесткие стандарты.

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

http://api.example.com/HelloWorld/Users/12345/Order/3/etc

0

Если вы аутентифицируете своих клиентов с помощью Oauth2, я думаю, вам понадобится подчеркнуть хотя бы два имени вашего параметра:

  • client_id
  • client_secret

Я использовал camelCase в моем (еще не опубликованном) REST API. При написании документации API я думал об изменении всего на snake_case, поэтому мне не нужно объяснять, почему параметры Oauth являются snake_case, а другие параметры - нет.

Смотрите: https://tools.ietf.org/html/rfc6749

Ещё вопросы

Сообщество Overcoder
Наверх
Меню