Чи існують якісь рекомендації щодо встановлення імен для API REST? [зачинено]


212

Чи створюються API REST, чи існують якісь вказівки чи стандартні стандарти для іменувань конвенцій в API (наприклад: компоненти контуру точки URL-адреси, параметри запитів)? Чи є верблюжі шапки нормою, або підкреслюють? інші?

Наприклад:

api.service.com/helloWorld/userId/x

або

api.service.com/hello_world/user_id/x

Примітка. Це не питання дизайну API RESTful, скоріше вказівки конвенції щодо іменування, які слід використовувати для можливих компонентів шляху та / або параметрів рядка запиту.

Будь-які вказівки будуть вдячні.

Відповіді:


150

Я думаю, вам слід уникати верблюжих шапок. Нормою є використання малих літер. Я б також уникав підкреслення і використовував натомість тире

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

api.service.com/hello-world/user-id/x

187
Згідно RFC2616, лише схема та частини хосту URL-адреси не залежать від регістру. Решта URL-адреси, тобто шлях та запит, ДОЛЖНІ бути чутливими до регістру. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Даррел Міллер

10
Даніеле, ти маєш рацію, дякую, що вказав на це. Однак де-факто ми зазвичай очікуємо, що URL-адреси ігнорують випадки, особливо частину імені ресурсу. Не було б сенсу для Userid & UserId поводитись інакше (якщо один із них не поверне 404)
LiorH

18
@LiorH: Чому ви вважаєте, що "немає сенсу" бути чутливими до регістру? Багато інших контекстів залежать від регістру до хорошого ефекту. Є деякі веб-сервіси (наприклад, Amazon S3), які застосовують чутливість регістру для кінцевих точок URL, і я думаю, що це цілком доречно.
Ганк

6
Серверні файлові системи @Dennis для Windows чутливі до регістру за замовчуванням, якщо я не дуже помиляюся technet.microsoft.com/en-us/library/cc725747.aspx
samspot

5
@samspot Добрий! Я подумав, що під час створення серверів вікна перейшли прямо до чутливих до регістру імен файлів. WOW, вони все ще просували їх шлях стільки, скільки могли, тобто "1 MicroSoft Way". ;-)
Денніс

87

API REST для Dropbox , Twitter , веб-служб Google та Facebook використовує підкреслення.


24
Одним з побічних ефектів цього є те, що підкреслені "слова" зберігаються цілими, разом у пошукових індексах google. Гігенізовані розбиваються на окремі слова.
Денніс


11
Хоча API Карт Google використовує підкреслення, в Посібнику Google щодо стилю потрібен Camel Case. Google+ API і Custom Search API , в зокрема, використовувати Camel Case.
Бенджамін

2
Але вони все ще використовують "-" як роздільник цих URL-адрес: P developers.google.com/custom-search/json-api/v1/reference/cse/… developers.google.com/+/best-practices dev.twitter. com / огляд / тематичні дослідження З іншого боку, вони використовують camelCase в параметрах запиту.
Маттіас

1
Ніхто не знає ...
Пьотр Кула

84

Подивіться уважно на 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/.

Сенс у тому, щоб забезпечити навігаційний шлях серед ресурсів.


4
Моє питання більше стосується узгодження імен можливих імен шляхів та / або параметрів запитів, якими б вони не були. Я погоджуюсь із вами рекомендаціями щодо дизайну, тому дякую, але я просто запитую про іменування конвенцій.
jnorris

1
Зауважимо, ніщо не заважає вам використовувати REST для неієрархічних ресурсів. Дійсні угоди про іменування URI, які ви використовуєте, неістотні, просто використовуйте все, що, на вашу думку, виглядає добре і вам легко розібратися на сервері. Клієнт не повинен нічого знати про створення ваших URI, оскільки вам потрібно відправляти URI на ресурси через гіпертекст у ваших відповідях.
aehlke

30

"UserId" - це зовсім неправильний підхід. Вербовий (методи HTTP) і іменник - це те, що Рой Філдінг мав на увазі для архітектури REST . Іменники:

  1. колекція речей
  2. річ

Одним із добрих умов іменування є:

[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, навіть html.

Можна відрізнити колекцію, додавши в кінці 's', наприклад:

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

Але це означає, що ви повинні слідкувати за тим, де ви поставили «а», а де ні. Плюс половина планети (азіатці для початківців) розмовляє мовами без явного множини, тому URL менш привітний для них.


Що означає {var}? Якщо я шукаю користувача за ім'ям, яке було б, наприклад, ... / user / username / tomsawyer?
Ганс-Петер Стрер

1
Якби у вас було три змінні (var) s з іменем x, y, z, то URL-адреса виглядала б так: sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis

@hstoerr Просто для переконання, що я зрозумів, більшість мов скриптів використовують якусь заміну змінної фігурної дужки '. Тож {var} означає, що деяка змінна (її ім'я) знаходиться там, і ось наступне {value} - це значення {var} перед нею. Приклад: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/food_reviews/review_aasures_higher_than/4.json] намагатиметься отримати результати json від yelp.com для показу їжі, що показує значення вище 4.
Денніс

Це найкраща відповідь, на мій погляд, і кудо для мислення на міжнародному рівні.
beiller

14

Ні. REST не має нічого спільного з умовами іменування URI. Якщо ви включаєте ці конвенції як частину свого API поза межами діапазону, а не лише через гіпертекст, то ваш API не RESTful.

Для отримання додаткової інформації див. Http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven


44
Відпочиньте ... все одно приємно мати приємні виглядаючі URL-адреси.
HDave

1
Погодьтеся з @HDave, дуже добре в дусі REST мати URL-адреси, які легко зрозуміти. Ви працюєте з URL-адресами, чому б ви не хотіли, щоб вони були легко зрозумітими, як імена змінних та параметрів у вашому коді?
mahemoff

4
@mahemoff вибачте, це мене супер педантично. Але те, як виглядають ваші URL-адреси, не має нічого спільного з REST. Це не означає, що їх не дуже добре мати, вони просто ортогональні тому, що описує REST. Неправильно сказати, що REST - це так структурувати URL-адреси, оскільки це призводить до того, що люди описують API RPC як REST лише тому, що вони мають читати / структурувати URL-адреси.
aehlke

5
Підводячи підсумок, красиві URL-адреси чудові, і кожен повинен їх мати. Це не має нічого спільного з REST.
aehlke

1
@aehlke дякую, що очистили це. Відпочинок не стосується структур URL. Я не розумію, чому людям так важко зрозуміти.
користувач1431072

9

Імена домену не залежать від регістру, але решта URI, безумовно, може бути. Велика помилка вважати, що URI не залежать від регістру.



2

Я не думаю, що справа у верблюдах не є проблемою у цьому прикладі, але я уявляю, що більш РЕЗЕКЦІЙНА конвенція про іменування для вищевказаного прикладу була б:

api.service.com/helloWorld/userId/x

замість того, щоб зробити userId параметром запиту (що цілком законно), мій приклад позначає цей ресурс в IMO, більш РЕСТЕВНІЙ спосіб.


Це не питання дизайну API RESTful, скоріше настанови конвенції щодо іменування, які слід використовувати для можливих компонентів шляху та / або параметрів рядка запиту. У вашому прикладі, чи повинні компоненти доріжки бути у верблюжих шапках, як ви використовували, або підкреслюєте?
jnorris

Отже, оскільки в REST ваші URL-адреси є вашими інтерфейсами, то це свого роду API-питання. Хоча я не думаю, що для Вашого прикладу є якісь вказівки, я б особисто пішов із справою верблюда.
Гендальф

Не слід використовувати параметри запиту для ресурсів, які потрібно кешувати на будь-якому рівні стеку HTTP.
aehlke

@aehlke Точно навпаки. Якщо ви НЕ хочете, щоб параметри запиту кешували, використовуйте стиль GET для параметрів, ~ АБО ~ зробіть DARN SURE, щоб змінити / вставити заголовки анти-кешування для всього, що ви не хочете кешувати. Крім того, thre - це деякий заголовок, який є хеш об'єкту / сторінки, використовуйте його для вказівки змін у речах, які ви хочете кешувати, але оновлюються, коли є зміни.
Денніс

@aehlke Дізнався про кешування і додаю його. Я пам’ятаю презентацію CodeCamp, де один із прискорень робив усі ці заголовки, а потім змінював ім'я файлу та всі посилання на нього, коли його зміст змінювалося, щоб отримати борбасерів та проксі-серверів на новішу версію після тривалого часу кешу. набір. Ось усі деталі gory: developers.google.com/speed/docs/best-practices/caching
Dennis

2

Якщо ви автентифікуєте своїх клієнтів за допомогою Oauth2, я думаю, вам знадобиться підкреслити принаймні два ваших імені параметрів:

  • client_id
  • client_secret

Я використовував camelCase у своєму (ще не опублікованому) API REST. Під час написання документації API я думав змінити все на snake_case, тому мені не доведеться пояснювати, чому парами Oauth є snake_case, а інші парами - ні.

Дивіться: https://tools.ietf.org/html/rfc6749


0

Я б сказав, що краще використовувати якомога менше спеціальних символів у URL-адресах REST. Однією з переваг REST є те, що він робить «інтерфейс» для сервісу легким для читання. Справа верблюда або випадок Pascal, ймовірно, добре підходить для імен ресурсів (Користувачі або користувачі). Я не думаю, що навколо REST дійсно немає жорстких стандартів.

Крім того, я думаю, що Гандальф має рацію, зазвичай в REST зазвичай чистіше не використовувати параметри рядка запиту, а натомість створювати шляхи, які визначають, з якими ресурсами ви хочете мати справу.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.