Дефис, подчеркивание или camelCase как разделитель слов в URI?

477

Я разрабатываю API на основе HTTP для приложения в интрасети. Я понимаю, что это довольно небольшая проблема в общей схеме вещей, но: я должен использовать дефисы, подчеркивания или camelCase для разделения слов в URI?


Вот мои первые мысли:

верблюжьего

  • возможные проблемы, если сервер нечувствителен к регистру
  • кажется, довольно широко используется в ключах строки запроса ( http://api.example.com ? searchQuery = ...), но не в других частях URI

Дефис

  • более эстетично, чем другие альтернативы
  • кажется, широко используется в части пути URI
  • никогда не видел дешифрованный ключ строки запроса в дикой природе
  • возможно лучше для SEO (это может быть мифом)

Подчеркивать

  • потенциально легче для языков программирования для обработки
  • несколько популярных API (Facebook, Netflix, StackExchange и т. д.) используют подчеркивания во всех частях URI.

Я склоняюсь к подчеркиваниям для всего. Тот факт, что большинство крупных игроков используют их, убедителен (см. Https://stackoverflow.com/a/608458/360570 ).

Джош Джонсон
источник
Из всего, что я прочитал, вы должны использовать дефисы , но подчеркивания кажутся более простыми в управлении.
ServAce85
1
Я считаю, что дефисы когда-то были лучше для целей SEO. Возможно, сейчас это не так, но так много людей приняли его, что это более широко признается в качестве наилучшей практики. С другой стороны, подчеркивания могут быть более легкими в программировании на сервере. Я использую PHP, поэтому гораздо проще использовать подчеркивание для имени функции, чем дефис. camelCase может быть проще всего реализовать, но читать его часто сложно. Наконец, я думаю, что вы были правы, когда сказали, что никогда не увидите hyphenated query string in the wild. Как правило, это время для CamelCase.
ServAce85
Согласно этому вопросу, подчеркивание не является допустимым вариантом: stackoverflow.com/questions/3641722/…
wytten
Вы упомянули популярные API, я хотел бы добавить один: Google. Насколько я видел, Google вообще ничего не использует между словами (см., Например, API Google Maps Matrix API).
nbeuchat

Ответы:

473

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

Дважды щелкните это в Chrome: camelCase
Дважды щелкните это в Chrome: under_score
Дважды щелкните это в Chrome: дефис

Видите, как Chrome (я слышал, что Google тоже делает поисковую систему) думает, что одно из них - это два слова?

camelCaseа underscoreтакже требует от пользователя использовать shiftключ, тогда как hyphenatedнет.

Поэтому, если вам следует использовать дефисы в веб-приложении, которое можно сканировать, зачем вам делать что-то другое в приложении для интрасети? Еще одна вещь, которую нужно запомнить.

Нил Макгиган
источник
20
Мой Firefox 24 в Windows 7 думает, что «дефис» - это два слова.
Марсель Стёр
9
и он ведет себя так же для 'under_score'.
Марсель Стёр
18
любое соглашение для queryString, например ?event_id=1или ?eventId=1???
user2727195
8
@ user2727195 Несмотря на то, что URL-адреса чувствительны к регистру, рекомендуется использовать строчные буквы везде, где это возможно, так как это исключает возможность опечатки.
Николас Шенкс
7
Интерактивный ответ :)
wild_nothing
210

Стандартная лучшая практика для API REST - использовать дефис , а не символ верблюда или подчеркивание.

Это взято из «Правил разработки REST API» Марка Массе от Oreilly.

Кроме того, обратите внимание, что переполнение стека само использует дефисы в URL: .../hyphen-underscore-or-camelcase-as-word-delimiter-in-uris

Как и WordPress: http://inventwithpython.com/blog/2012/03/18/how-much-math-do-i-need-to-know-to-program-not-that-much- фактически

Аль Суигарт
источник
3
Если вы посмотрите главу о рекомендациях для строки запроса в REST API Design Rulebook, вы заметите, что рекомендации различаются в зависимости от части правила. Там нет явного правила о вхождении в строки запроса, но вы обнаружите, что все примеры в разделе о строках запроса, что все ключи в случае верблюда.
Майкл Лэнг
1
Just FYI - «REST API Design Rulebook» был опубликован в октябре 2011 года. Возможно, что-то изменилось за последние 8 лет.
ChrisN
25

Хотя я рекомендую дефисы, я также постулирую ответ, которого нет в вашем списке:

Вообще ничего

  • API моей компании имеет такие URI, как /quotationrequests/, /purchaseorders/и так далее.
  • Несмотря на то, что вы сказали, что это приложение для интранета, вы указали SEO в качестве преимущества. Google соответствует шаблону / foobar / в URL для запроса?q=foo+bar
  • Я действительно надеюсь, что вы не подумаете о выполнении вызова PHP для любой произвольной строки, которую пользователь передает в адресную строку, как предлагает @ ServAce85!
Николас Шэнкс
источник
+1 за указание на очевидный выбор. Он также устраняет неоднозначность / quotationrequests / from / quotation / запросы /.
Джош Петитт
34
Что плохо в этом ответе, так это то, что с точки зрения SEO у машины нет возможности понять, где заканчивается одно слово, а где начинается другое, поэтому эта информация теряется. Это также трудно для читателей. Лучше иметь несколько разделителей на уровне слов, чем ничего.
Аль Суигарт
3
@ AlSweigart SEO не имеет значения, так как это приложение для внутренней сети за стеной входа в систему.
Николас Шенкс
2
Я согласен с @ niel-mcguigan, что, несмотря на то, что это приложение для интрасети, если вы везде используете дефисы, это одна вещь, которую нужно помнить.
Дрю Гудвин
2
@DrewGoodwin Достаточно справедливо. Хотя обратите внимание, что я сказал «постулат», а не «рекомендовать» :-) И в доменах обычно нет дефисов, поэтому использование их в путях - это еще одна вещь, которую нужно запомнить.
Николас Шенкс
18

В целом, это не окажет достаточного влияния, о котором нужно беспокоиться, особенно потому, что это приложение для внутренней сети , а не обычное интернет-приложение. В частности, так как это интранет , SEO не является проблемой, так как ваша интрасеть не должна быть доступна для поисковых систем. (и если это так, это не приложение для внутренней сети).

И любой интегрированный фреймворк уже имеет способ сделать это по умолчанию, или его довольно легко изменить, как он работает с компонентами URL, состоящими из нескольких слов, так что я бы не стал сильно беспокоиться об этом.

Тем не менее, вот как я вижу различные варианты:

Дефис

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

Подчеркивать

  • Опять же, они чувствуют себя неправильно в компонентах URL. Они разбивают поток (и красоту / простоту) URL-адреса, так как они по существу добавляют большое, тяжелое видимое пространство в середине чистого, плавного URL-адреса.
  • Они имеют тенденцию сливаться с подчеркиванием. Если вы ожидаете, что ваши пользователи скопируют и вставят ваши URL-адреса в MS Word или другие подобные программы для редактирования текста, или в любое другое место, где они могут выбрать URL-адрес и оформить его подчеркиванием (как обычно это делают ссылки ), тогда вы можете захотеть Избегайте подчеркивания в качестве разделителей слов. В частности, при печати подчеркнутый URL с подчеркиванием имеет тенденцию выглядеть так, как будто в нем вместо подчеркивания есть пробелы .

CamelCase

  • Безусловно, мой любимый, так как он заставляет URL-адреса работать лучше и не имеет ошибок, которые есть в двух предыдущих вариантах.
  • Может быть немного сложнее для чтения людям, которым трудно отличить прописные буквы от строчных, но это не должно быть большой проблемой в URL, потому что большинство «слов» должны быть компонентами URL и разделены в /любом случае , Если вы обнаружите, что у вас есть компонент URL длиной более 2 «слов», вам, вероятно, следует попытаться найти более подходящее название для этого понятия.
  • У него есть возможная проблема с чувствительностью к регистру, но большинство платформ можно настроить как с учетом регистра, так и без учета регистра. В любом случае, это действительно проблема только для 2 случаев: а) люди, набирающие URL, и б) программисты (поскольку мы не люди), вводящие URL. Опечатки всегда являются проблемой, независимо от чувствительности к регистру, так что это ничем не отличается, что все в одном случае.
cdeszaq
источник
13
Не согласен. Посмотрите на SO, посмотрите все WordPress сайты, посмотрите на большинство новостных сайтов, все они используют дефисы. Также верблюжьи кейсы сочетаются с кейсами, на мой взгляд, веб должен быть всего строчным.
Фабьен Варнез,
4
На мой взгляд, сеть должна быть без учета регистра, на самом деле. Что касается соглашения, если вы будете следовать подходу маршрутов RoR (ruby on rails), вы должны использовать подчеркивание. Обычно я делаю так, чтобы это было единообразно в зависимости от маршрутов, созданных рельсами, и моих названных маршрутов. Тем не менее, я считаю, что для меня тире читать лучше, чем подчеркивание.
rpbaltazar
1
Возможно, у них есть внутренняя поисковая система в их интранете?
Юха Унтинен
3
Не согласен. Оба ваших аргумента против дефисов ошибочны. Нет никакой опасности в отрицании или вычитании, потому что здесь мы говорим об именной части кортежа, вы никогда не должны функционировать или оценивать именную часть кортежа на предмет математики или отрицания. Также нет ничего неловкого в использовании дефисов в URI, так как это давняя лучшая практика, используемая нехваткой устоявшихся сайтов. Они также не требуют нажатия клавиши Shift и воспринимаются как границы слов практически всеми.
17
2
Насколько я помню, дефисы были широко используемой нормой в URL и определенно считаются лучшей практикой в ​​современных стандартах. Не использовать их, потому что чувство неловкости кажется мне неловким.
пистолет-пит
2

Короткий ответ:

слова в нижнем регистре с дефисом в качестве разделителя

Длинный ответ:

Какова цель URL?

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

Google рекомендует использовать дефисы

Попробуйте использовать пунктуацию в своих URL. URL http://www.example.com/green-dress.html для нас гораздо полезнее, чем http://www.example.com/greendress.html . Мы рекомендуем использовать дефисы (-) вместо подчеркивания (_) в ваших URL.

Исходя из опыта программирования, CamelCase является популярным выбором для обозначения совместных слов.

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

Источник: https://metamug.com/article/rest-api-naming-best-practices.html#word-delimiters

сортировщик
источник
-1

вот лучшее из обоих миров.

Я также «люблю» подчеркивания, помимо всех ваших положительных моментов о них, есть также определенный стиль старой школы для них.

Поэтому я использую подчеркивание и просто добавляю небольшое правило перезаписи в файл .htaccess вашего Apache, чтобы переписать все подчеркивания в дефисы.

https://yoast.com/apache-rewrite-dash-underscore/

user2597538
источник