2009-04-22 5 views
166

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

Например:

api.service.com/helloWorld/userId/x 

или

api.service.com/hello_world/user_id/x 

Примечание: Это не вопрос RESTful дизайна API, а руководящие принципы именования конвенции использовать для возможных компонентов пути и/или запроса используемые строки.

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

ответ

123

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

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

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

В соответствии с RFC2616 только схема и часть хоста URL-адреса не чувствительны к регистру. Остальная часть URL-адреса, то есть путь и запрос ДОЛЖНЫ быть чувствительны к регистру. http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3 –

+7

Даниил, вы правы, спасибо, что указали это. Однако де-факто мы обычно ожидаем, что URL-адреса будут игнорировать случаи, особенно часть имени ресурса. Для userid & UserId было бы бессмысленно вести себя по-другому (если только один из них не возвращает 404) – LiorH

+16

@LiorH: Почему вы считаете, что это «не имеет смысла», чтобы быть чувствительным к регистру? Множество других контекстов чувствительны к регистру для хорошего эффекта. Существуют некоторые веб-службы (например, Amazon S3), которые * делают * обеспечивают чувствительность к регистру для конечных точек URL, и я думаю, что это вполне уместно. –

2

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

api.service.com/helloWorld/userId/x

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

+0

Это не вопрос RESTful API дизайна, а руководящие принципы именования конвенции использовать для возможных компонентов пути, и/или параметров строки запроса используются.В вашем примере, должны ли компоненты пути находиться в верблюжьих шапках, как вы использовали, или подчеркиваете? – jnorris

+0

Ну, так как в REST ваши URL-адреса являются вашими интерфейсами, тогда это своего рода вопрос API. Хотя я не думаю, что есть какие-то рекомендации, характерные для вашего примера, я бы лично поехал с верблюдом. – Gandalf

+0

Вам не следует использовать параметры запроса для ресурсов, которые вы хотите кэшировать на любом уровне стека HTTP. – aehlke

1

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

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

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

73

Посмотрите внимательно на 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

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

+1

Просто отметим, что вам нечего использовать REST для неиерархических ресурсов. Фактические соглашения об именах URI, которые вы используете, несущественны, просто используйте то, что, по вашему мнению, выглядит хорошо, и вам легко разбираться на сервере. Клиент не должен знать ничего о генерации ваших URI, поскольку вам нужно отправлять URI на ресурсы через гипертекст в своих ответах. – aehlke

14

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

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

+36

Дайте ему отдохнуть ... по-прежнему приятно иметь красивые URL-адреса. – HDave

+1

Согласитесь с @HDave, это очень важно в духе REST иметь URL-адреса, которые легко понять. Вы работаете с URL-адресами, почему бы вам не так легко их понять, как имена переменных и параметров в вашем коде? – mahemoff

+4

@mahemoff извините, это я супер педантичный. Но то, что ваши URL-адреса выглядят, не имеет никакого отношения к REST. Это не означает, что они не очень хорошие, они просто ортогональны тому, что описывает REST. Неверно сказать, что REST - это структурирование URL-адресов таким образом, поскольку это приводит к тому, что люди, описывающие API-интерфейсы RPC, являются REST только потому, что у них есть читаемые/структурированные URL-адреса. – aehlke

9

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

73

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

+13

Одним из побочных эффектов этого является то, что подчеркнутые «слова» хранятся целиком вместе в поисковых индексах google. Хименованные разбиты на отдельные слова. – Dennis

+0

Пример: https://dev.twitter.com/docs/api/1.1 –

+7

В то время как API Карт Google использует символы подчеркивания, [Руководство по стилю Google] (http://google-styleguide.googlecode.com/svn/trunk /jsoncstyleguide.xml?showone=Property_Name_Format#Property_Name_Format) требует Camel Case. [Google+ API] (https://developers.google.com/+/api/latest/activities/list) и [API пользовательского поиска] (https://developers.google.com/custom-search/json-api/v1/reference/cse/list), среди прочих, используйте Camel Case. – Benjamin

26

«UserId» - это совершенно неправильный подход. Подходы Verb (HTTP Methods) и Noun - это то, что Roy Fielding предназначено для The REST architecture. Существительных либо:

  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, even html.

можно выделить коллекцию, добавляя «S» в конце, как:

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

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

+1

Рой, а не Роб :) – tuespetre

+0

Что означает {var}? Если я ищу пользователя по имени, которое будет, например .../user/username/tomsawyer? –

+1

Если у вас есть три переменных (var) s с именами x, y, z, то вы будете выглядеть так: http: //sub.domain.tld/x/value_of_x/y/value_of_y/z/value_of_z – Dennis

3

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

1

Если аутентификация ваших клиентов с oauth2 Я думаю, что вам нужно будет подчеркнуть, по крайней мере, два из ваших имен параметров:

  • CLIENT_ID
  • client_secret

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

См: https://tools.ietf.org/html/rfc6749

Смежные вопросы