Мое приложение имеет ресурс в /foo
. Обычно он представлен полезной нагрузкой HTTP-ответа следующим образом:
{"a": "some text", "b": "some text", "c": "some text", "d": "some text"}
Клиент не всегда нуждается во всех четырех членах этого объекта. Что означает RESTfully semantic, чтобы клиент мог сообщить серверу, что ему нужно в представлении? например если он хочет:
{"a": "some text", "b": "some text", "d": "some text"}
Как это сделать GET
? Некоторые возможности (я искал исправление, если не понял REST):
-
GET /foo?sections=a,b,d
.- Строка запроса (называемая как строка запроса после всех), похоже, означает "найти ресурсы, соответствующие этому условию и рассказать мне о них", а не "представлять этот ресурс мне в соответствии с этой настройкой".
-
GET /foo/a+b+d
Моя любимая , если семантика REST не охватывает эту проблему, из-за ее простоты.- Прерывает непрозрачность URI, нарушая HATEOAS.
- Кажется, нарушить различие между ресурсом (единственным значением URI является идентификация одного ресурса) и представление. Но это спорно, потому что в соответствии с
/widgets
, представляющий презентабельный список/widget/<id>
ресурсы, которые я никогда не имел проблем с.
- Ослабьте мои ограничения, ответьте на
GET /foo/a
и т.д., и попросите клиента сделать запрос на компонент/foo
, который он хочет.- Умножает накладные расходы, которые могут стать кошмаром, если
/foo
содержит сотни компонентов, а клиенту - 100. - Если я хочу поддерживать HTML-представление
/foo
, я должен использовать Ajax, что является проблематичным, если я просто хочу, чтобы одна страница HTML, которую можно обходить, отображала минималистскими браузерами и т.д. - Чтобы поддерживать HATEOAS, он также требует, чтобы ссылки на эти "подресурсы" существовали в других представлениях, возможно, в
/foo
:{"a": {"url": "/foo/a", "content": "some text"}, ...}
- Умножает накладные расходы, которые могут стать кошмаром, если
-
GET /foo
,Content-Type: application/json
и{"sections": ["a","b","d"]}
в теле запроса.- Unbookmarkable и uncacheable.
- HTTP не определяет семантику тела для
GET
. Это законный HTTP, но как я могу гарантировать, что какой-то пользовательский прокси не отделяет тело от запросаGET
? - My клиент REST не позволит мне поместить тело в запрос
GET
, чтобы я не мог используйте это для тестирования.
- Пользовательский HTTP-заголовок:
Sections-Needed: a,b,d
- Я предпочел бы избежать пользовательских заголовков, если это возможно.
- Unbookmarkable и uncacheable.
-
POST /foo/requests
,Content-Type: application/json
и{"sections": ["a","b","d"]}
в теле запроса. Получите201
с помощьюLocation: /foo/requests/1
. ТогдаGET /foo/requests/1
для получения желаемого представления/foo
- неуклюжим; требуется обратный код и какой-то странный код.
- Unbookmarkable и uncacheable, поскольку
/foo/requests/1
- это просто псевдоним, который будет использоваться только один раз и сохраняется только до его запроса.