Стандарт останова: параметры пути или параметры запроса
Я создаю новую службу REST.
Каков стандарт передачи параметров сервисам REST. Из разных реализаций REST в Java вы можете настроить параметры как часть пути или как параметры запроса. Например,
Параметры пути
http://www.rest.services.com/item/b
Параметры запроса
http://www.rest.services.com/get?item=b
Кто-нибудь знает, какие преимущества/недостатки для каждого метода передачи параметров. Кажется, что передача параметров как части пути, по-видимому, лучше совпадает с понятием протокола REST. То есть, единственное местоположение означает уникальный ответ, правильно?
Ответы
Ответ 1
Контуры, как правило, кэшируются, параметры, как правило, не являются, как правило.
Итак...
GET /customers/bob
против
GET /customers?name=bob
Первое, скорее всего, будет кэшироваться (при условии правильности заголовков и т.д.), в то время как последнее, скорее всего, не будет кэшироваться.
Ответ 2
tl; dr: Возможно, вы захотите обоим.
Пункт № 42 существует:
GET /items/42
Accept: application/vnd.foo.item+json
--> 200 OK
{
"id": 42,
"bar": "baz"
}
GET /items?id=42
Accept: application/vnd.foo.item-list+json
--> 200 OK
[
{
"id": 42,
"bar": "baz"
}
]
Элемент № 99 не существует:
GET /items/99
Accept: application/vnd.foo.item+json
--> 404 Not Found
GET /items?id=99
Accept: application/vnd.foo.item-list+json
--> 200 OK
[
]
Пояснения и комментарии
-
/items/{id}
возвращает item
, а /items?id={id}
возвращает item-list
.
- Даже если в отфильтрованном
item-list
имеется только один элемент, список элементов остается неизменным (в отличие от самого элемента).
- Так получилось, что
id
является уникальным свойством. Если мы будем фильтровать другие свойства, это будет работать точно так же.
- Элементы ресурса коллекции могут быть названы только с использованием уникальных свойств (например, ключей как подресурсов коллекции) по понятным причинам (они являются обычными ресурсами, а URI однозначно идентифицируют ресурсы).
- Если элемент не найден при использовании фильтра, ответ остается
OK
и по-прежнему содержит список (хотя и пустой). Просто потому, что мы запрашиваем отфильтрованный список, содержащий элемент, который не существует, не означает, что сам список не существует.
Потому что они настолько разные и независимо друг от друга полезны, вам могут понадобиться как. Клиент хочет различать все случаи (например, является ли список пустым или сам список не существует, и в этом случае вы должны вернуть 404 для /items?...
).
Отказ от ответственности: Этот подход ни в коем случае не является "стандартным". Это имеет для меня такой смысл, хотя я чувствовал, что разделяю.
PS: Именование коллекции предметов "get" - это запах кода; предпочитают "предметы" или подобные.
Ответ 3
Второй пример "параметров запроса" неверен, потому что "get" включен как часть пути. GET - это тип запроса, он не должен быть частью пути.
Существует 4 основных типа запросов:
GET
PUT
POST
DELETE
Запросы GET всегда должны быть заполнены без какой-либо информации в теле запроса. Кроме того, запросы GET должны быть "безопасными", что означает, что никакие существенные данные не изменяются запросом.
Помимо упомянутого выше проблемы кэширования, параметры в пути URL-адреса, как правило, потребуются и/или ожидаются, потому что они также являются частью вашей маршрутизации, тогда как параметры, переданные в строке запроса, более переменны и не влияют на какую часть вашего приложения направляется запрос. Хотя потенциально может также передавать набор параметров переменной длины через url:
GET somedomain.com/states/Virginia,California,Mississippi/
Хорошая книга для чтения в качестве учебника по этой теме "Restful Web Services" . Хотя я буду предупреждать вас о том, чтобы быть готовым пересмотреть некоторую избыточную информацию.
Ответ 4
Я думаю, это зависит. Один URL для одного ресурса. Если вы хотите получить этот ресурс несколько иначе, укажите строку запроса. Но для значения, которое будет поставлять другой ресурс, поместите его в путь.
Итак, в вашем примере значение переменной напрямую связано с возвращаемым ресурсом. Таким образом, это имеет больше смысла в пути.
Ответ 5
Первая вариация немного чище и позволяет вам резервировать параметры запроса для таких вещей, как порядок сортировки и страница, как в
http://www.rest.services.com/items/b?sort=ascending;page=6
Ответ 6
Это большой фундаментальный вопрос. Недавно я пришел к выводу, чтобы не использовать параметры пути. Они приводят к двусмысленному разрешению ресурсов. URL-адрес - это в основном "имя метода" части кода, работающей где-то на сервере. Я предпочитаю не смешивать имена переменных с именами методов. Название вашего метода, по-видимому, "клиент" (IMHO - это гнилое имя для метода, но люди REST любят этот шаблон). Параметр, который вы передаете этому методу, - это имя клиента. Параметр запроса хорошо работает для этого, и этот ресурс и значение параметра запроса могут быть даже кэшированы, если это необходимо.
Нет физического ресурса ИТ-клиентов. Вероятно, нет файла на диске в папке клиента, названной в честь клиента. Это веб-сервис, который выполняет какую-то транзакцию базы данных. "Ресурс" - это ваш сервис, а не клиент.
Эта навязчивая идея над REST и веб-глаголами напоминает мне о ранних днях объектно-ориентированного программирования, где мы пытались заковать наш код в виртуальные представления физических объектов. Затем мы поняли, что объекты обычно являются виртуальными концепциями в системе. OO по-прежнему полезно, когда вы делаете правильный путь. REST также полезен, если вы понимаете, что ресурсы RESTful являются сервисами, а не объектами.