<TL;DR>
至少,我正在寻找一种方法来有条件地排除资源上的某些属性,使其不包含在每次调用的响应中(见fields
下文)。
理想情况下,我想使用支持以下所有要点的 ServiceStack 实现 REST 服务。
更新
虽然我真的很喜欢 ServiceStack 的方法,并且如果可能的话更愿意使用它,但如果它不是特别适合这些想法,我宁愿不弯腰把它搞砸以使其工作。如果是这样的话,任何人都可以指出另一个可能更合适的 c# 框架吗?当然,我自己也在积极探索其他选择。
</TD;DR>
在这次题为“设计 REST + JSON API ”的演讲中,演讲者描述了他在 JSON 中的资源引用(通过href
资源的属性)的策略。除此之外,他还描述了两个查询参数 (fields
和expand
),用于控制对 REST 服务的调用响应中包含哪些数据。我一直在尝试深入研究 ServiceStack 框架以实现对fields
特别的支持,但到目前为止还没有成功。这目前在 ServiceStack 中可行吗?理想情况下,该解决方案与格式无关,因此适用于所有 ServiceStack 支持的输出格式。我想expand
会遵循同样的策略。
我将在这里描述这些功能,但我认为链接上的谈话可以更好地解释它们。
假设我们有一个具有以下属性的 Profiles 资源:givenName
、surname
、gender
和favColor
。socialNetworks
Profiles 资源还包括用户在属性中所属的社交网络列表。
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=surname,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/..."
},
...
]
}
}