Я ищу правильный RESTful способ получить эти данные
Просто выполнить запрос HTTP GET
на URI, который указывает на ресурс, который производит эти данные!
TL; DR
- REST не заботится о URI дизайна - но на своих ограничений!
- Клиенты выполняют переходы состояний посредством возможных действий, возвращаемых сервером посредством динамически идентифицированных гиперссылок, содержащихся в ответе.
- Клиенты и сервера могут договориться о предпочтительном типе гипермедиа
- Вместо вложения всего (суб) ресурса рассмотреть только возвращая ссылку на этот ресурс так клиент может посмотреть его, если заинтересованные
Во-первых, REST действительно не заботится о дизайне URI, пока URI уникален. Конечно, простой дизайн URI легче понять для людей, хотя по сравнению с HTML фактическая ссылка может быть скрыта за более выраженным текстом и, следовательно, также не так важна для людей, пока они могут найти ссылку и может выполнить против него действие. Далее, почему вы думаете, что ваш «ответ» или API RESTful? Чтобы вызвать API RESTful, API должен уважать пару constraints. Среди этих ограничений есть одно довольно известное модное слово: гипертекст как движок состояния приложения (HATEOAS).
REST - это обобщенная концепция Сети, которую мы используем каждый день. Обычная задача для веб-сессии заключается в том, что клиент запрашивает что-то, где сервер отправляет HTML-документ с большим количеством ссылок и других ресурсов, которые клиент может использовать для запроса дальнейших страниц или для потоковой передачи видео (или того, что когда-либо). Операция пользователя g на клиенте может использовать возвращаемую информацию для продолжения, запрашивать новые страницы, отправлять информацию на сервер и т. Д. И т. Д. То же самое относится и к приложениям RESTful. Это был REST, просто определяемый как HATEOAS. Если теперь вы посмотрите на свой «ответ» и дважды проверьте с помощью ограничения HATEOAS, вы можете увидеть, что ваш ответ не содержит ссылок для начала. Поэтому клиенту необходимо знание домена, чтобы продолжить.
JSON сам по себе не самый лучший тип IMM гипермедиа, поскольку он определяет только общий синтаксис данных, но не несет никакой семантики, подобно простому XML, который может иметь некоторые DTD или схемы, которые клиент может использовать для проверки документ и проверить, имеются ли дополнительные семантические правила в другом месте. Есть несколько типов гипермедиа, которые накапливаются на JSON, которые, вероятно, лучше подходят, например, f.e. application/hal+json
(Хорошее сравнение типов гипермедиа на основе JSON можно найти в этом blog post). Вы, конечно, имеете право определять свой собственный тип гипермедиа, хотя некоторые клиенты могут не понимать его из коробки.
Если вы принимаете f.e. посмотрите на HAL, вы увидите, что он определяет элемент _embedded
, где вы можете поместить определенные ресурсы. Это кажется идеальным в вашем случае. В зависимости от вашего дизайна, orders
также может быть ресурсом самостоятельно и, таким образом, быть доступен через GET /orders/{orderId}
. Вместо того, чтобы встраивать весь под-ресурс, вы также можете просто включить ссылку на этот (дополнительный) ресурс, чтобы клиент мог искать данные, если они заинтересованы.
Если есть случаи, когда вы хотите вернуть только данные клиента и другие случаи, когда вы хотите также включить другие данные, вы можете f.e. определить разные типы гипермедиа (на основе HAL f.e.) для обоих, один возвращает только данные клиента, а другой также включает другие данные. Эти типы могут быть названы так: application/vnd.yourcompanyname.version.customers.hal+json
или application/vnd.yourcompanyname.version.customer_orders.hal+json
. Хотя это, безусловно, накладные расходы на разработку по сравнению с добавлением простого запроса к запросу, семантика более понятна, а служебные данные документации относятся к типу гипермедиа (или представлению), а не к операции HTTP.
Вы можете, конечно, также определить некоторую структуру вида, в которой один вид возвращает данные клиента только в том случае, когда другое представление возвращает данные клиента, включая заказы, похожие на response, которые я дал по не столь несвязанной теме.
Таким образом, число 1 должно возвращать только 'orders', и номер 2 должен возвращать данные' customer', с или без 'данных orders' (строки запроса может быть использован, чтобы обеспечить переключатель) ..? Это то, что вы ожидаете, или это официальная вещь REST ..? –