Поддержка ServiceStack для условно пропущенных полей в ответе REST для каждого вызова
<TL;DR>
Как минимум, я ищу способ условно исключить определенные свойства ресурса из включения в ответ для каждого вызова (см.fields
ниже).
В идеале я хотел бы реализовать сервис REST с ServiceStack, который поддерживает все основные моменты, приведенные ниже.
ОБНОВИТЬ
Хотя мне действительно нравится подход ServiceStack в целом, и я предпочел бы использовать его, если это возможно, если он не особенно хорошо подходит для этих идей, я бы не стал склоняться над ним, убивая его, чтобы он работал. Если это так, может ли кто-нибудь указать на другую среду C #, которая может быть более подходящей? Конечно, я активно изучаю другие варианты.
</TD;DR>
В этомговорить озаглавленныйРазработка API REST + JSON, докладчик описывает свою стратегию для ссылок на ресурсы (черезhref
собственность на ресурсы) в JSON. В дополнение к этому он описывает два параметра запроса (fields
а такжеexpand
) для контроля того, какие данные включены в ответ на звонок в службу REST. Я безуспешно пытался покопаться в инфраструктуре ServiceStack, чтобы добиться поддержкиfields
в частности, но до сих пор были неудачными. Это возможно в настоящее время в ServiceStack? В идеале решение должно быть независимым от формата и, следовательно, работать во всех поддерживаемых форматах вывода ServiceStack. Я бы вообразилexpand
будет следовать той же стратегии.
Я опишу эти функции здесь, но я думаю, что разговор по ссылке лучше объяснит их.
Допустим, у нас есть ресурс Profiles со следующими свойствами:givenName
, surname
, gender
, а такжеfavColor
, Ресурс Profiles также включает в себя список социальных сетей, к которым принадлежит пользователь вsocialNetworks
свойство.
href
- (42:22 в видео) Каждый ресурс содержит полную ссылку на него в сервисе REST. ВызовGET /profiles/123
вернется
{
"href":"https://host/profiles/123",
"givenName":"Bob",
"surname":"Smith",
"gender":"male",
"favColor":"red",
"socialNetworks": {
"href":"https://host/socialNetworkMemberships?profileId=123"
}
}
Обратите внимание, чтоsocialNetworks
свойство возвращает объект только с заполненным значением href. Это делает ответ коротким и целенаправленным, а также дает конечному пользователю достаточно информации для выполнения дальнейших запросов, если это необходимо.href
Свойство, используемое повсеместно в этом поместье, упрощает (в любом случае концептуально) повторное использование структур данных ресурсов в качестве дочерних элементов других ресурсов.
fields
- (55:44 в видео) Параметр строки запроса, который указывает серверу включать только указанные свойства требуемого ресурса в ответ REST.
Нормальный ответ отGET /profiles/123
будет включать в себя все свойства ресурса, как показано выше. Когдаfields
Параметр запроса включен в запрос, возвращаются только указанные поля. 'GET / propfiles / 123? Fields = фамилия, favColor' вернется
{
"href":"https://host/profiles/123",
"surname":"Smith",
"favColor":"red"
}
expand
- (45:53 в видео) Параметр строки запроса, который указывает серверу конкретизировать указанные дочерние ресурсы в результате. Используя наш пример, если вы должны были позвонитьGET /profiles/123?expand=socialNetworks
вы можете получить что-то вроде
{
"href":"https://host/profiles/123",
"givenName":"Bob",
"surname":"Smith",
"gender":"male",
"favColor":"red",
"socialNetworks": {
"href":"https://host/socialNetworkMemberships?profileId=123",
"items": [
{
"href":"https://host/socialNetworkMemberships/abcde",
"siteName":"Facebook",
"profileUrl":"http://www.facebook.com/..."
},
...
]
}
}