У меня были споры о том, что делать с косой чертой в RESTful API.
Допустим, у меня есть ресурс под названием собаки и подчиненные ресурсы для отдельных собак. Поэтому мы можем сделать следующее:
GET/PUT/POST/DELETE http://example.com/dogs
GET/PUT/POST/DELETE http://example.com/dogs/{id}
Но что нам делать со следующим частным случаем:
GET/PUT/POST/DELETE http://example.com/dogs/
Мое личное мнение таково, что это говорит о том, что нужно отправить запрос на ресурс отдельной собаки с id = null
. Я думаю, что API должен вернуть 404 для этого случая.
Другие говорят, что запрос обращается к ресурсу собак, т.е. косая черта игнорируется.
Кто-нибудь знает окончательный ответ?
dogs
иdogs/
как эквивалент. Для меня понятно, чтоdogs/
это каталог, содержащий отдельных собак. Менее понятно, чтоdogs
есть, но я бы отнесся к этому как к эквивалентному, так же как большинство веб-серверов принимают доступ к каталогам без запаздывания/
.Ответы:
Ничто из этого не является авторитетным (поскольку REST не имеет точного значения). Но из оригинальной статьи о REST полный (не заканчивающийся на /) URL называет ресурс, в то время как один, заканчивающийся косой чертой '/', является группой ресурсов (вероятно, не так сформулировано).
GET URL с косой чертой в конце должен перечислять доступные ресурсы.
PUT в URL с косой чертой должен заменить все ресурсы.
УДАЛЕНИЕ на URL с косой чертой должно удалить все ресурсы
Предполагается, что POST для URL с косой чертой создаст новый ресурс, а затем будет доступен. Чтобы быть совместимым, новый ресурс должен находиться в этом каталоге (хотя многие из архитектур RESTful обманывают здесь).
и т.п.
Вики-страница на эту тему, кажется, хорошо объясняет это:
Смотрите пример https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_services .
источник
/
/
?GET http://example.com/dogs
может возвращать метаинформацию о собаках (не сам список, а метаинформацию о списке собак). Может быть, или, возможно, это ошибка.As the last character within a URI’s path, a forward slash (/) adds no semantic value and may cause confusion. It’s better to drop them completely.
Это не единственное место , где предлагают не использовать тренировочный слешНет такого, поскольку нет официального документа о том, что требуется для того, чтобы услуга считалась RESTful.
Это сказало, что я позволю косую черту просто для простоты использования. С технической точки зрения это можно рассматривать как попытку получить доступ к собаке с нулевым ID; Я не вижу пользователей, делающих этот прыжок, если они не прочитали это в вашей документации. Я вижу пользователя, пытающегося написать код против вашего API и включающего косую черту просто по привычке и удивляющегося, почему он получает ответ 404, когда ему нужен список собак.
источник
example.com/dogs
ресурс полностью независим от любого ресурсаexample.com/dogs/X
. Таким образом, DELETE onexample.com/dogs
не должен удалять всех собак / * (хотя может, если это семантика). Но DELETEexample.com/dogs/
должен удалить всех собак / *.foo
,foo/
иfoo////
тождественно. Похоже, что в основном удаляются пустые сегменты пути. Таким образом, если вы используете тот же подход с вашим REST-сервисомdogs
и будетеdogs/
ссылаться на то же самое.Два пути.
Способ 1
Всегда используйте конечные косые черты для любого ресурса, который может содержать дочерние элементы.
Просто рассмотрите «GET» в каталоге public_html с файлами.
Невозможно, когда hello.html является файлом:
Но возможно, когда hello.html является каталогом:
Так что, если у «hello.html» могут быть дети, то всегда и всегда «/hello.html/» и «/hello.html/index.html» (или просто /hello.html/) - это список этих детей. ,
Способ 2
Быть умным".
Команда find не заботится о типе hello.html. Каталог или файл, кому какое дело, это название объекта. Когда мы пишем «cp youagain.html hello.html», cp может выяснить, как обращаться с hello.html. ср умный. Ваш веб-сервер тоже умен. У него есть библиотека обработки пути. У него есть маршрутизация. Он может определить и сказать вам, является ли имя объектом или каталогом. Он может перенаправить бла на бла / или даже просто подать одинаковый ответ обоим. Это потрясающе !!! путь. Так много технологий. Кто когда-либо хотел бы просто объединить строки пути, когда мы могли бы сделать все это ???
источник