【发布时间】:2014-09-26 14:58:31
【问题描述】:
我一直在经历这个blog,我明白他在说什么,尤其是关于层次结构(沿着小路往回走)。
所以
/objects/1/property
删除property 应该会给你 id 为 1 的对象,删除 id 应该给你所有的对象。优秀且合乎逻辑。
但我总是通过视图模型公开我的数据,所以,
/objects/list/1 将为我提供 id 为 1 的对象的对象列表视图模型。或者/objects/detail/1 将为我提供 id 为 1 的对象的对象详细视图模型。
使用这种方法,我最终得到了一个很长的结构,只是为了获得一个特定的视图模型! IE。 objects/visualization/analysis/thread。这还算安宁吗?我似乎正在做的(下意识地!)正在构建我的 RESTful API 以匹配这个特定视图模型所在的命名空间或模块(因此在 .NET 中它将是命名空间:app.models.object.visualization.analysis)。
如何最好地构建这样一个宁静的端点?有类似的东西会更好吗
objects-list/1 和objects-detail/1?
谢谢。
示例:
对不起,我应该更清楚。我将给出一个 .NET 示例。假设我有一个购物车类
public class Cart
{
public int CardId { get; set; }
public string CartName { get; set; }
public DateTime Created { get; set; }
public DateTime LastUpdated { get; set; }
public IEnumerable<CartItem> Items { get; set; }
}
通过宁静的设计,我可以将购物车公开为/carts、/carts/1、/carts/1/items 等等。但我总是公开视图模型,而不是实际的数据层对象。即
public class CartListModel
{
public int CartId { get; set; }
public string CartName { get; set; }
}
和
public class CartViewModel
{
public int CartId { get; set; }
public string CartName { get; set; }
public DateTime LastUpdated { get; set; }
public IEnumerable<CartItemViewModel> Items { get; set; }
}
因此,这样我只公开了出于特定目的实际需要的数据。现在,我将这些视图模型公开为/carts/list 或/carts/list/1。还有/carts/view 和/carts/view/1。所以最初的问题是这样的宁静吗?事实上,我是否需要为每个视图模型设置一个单独的端点?所以/carts-list和/carts-view、carts-view/1等等。
非 .NET 示例
真的不知道该放什么!视图模型是对象的表示,仅公开绑定到视图所需的某些属性。
所以假设我的对象具有以下 JSON 结构
{
id: 1,
name: 'Cart 1',
lastUpdated: '26-Sep-2014 16:51:23',
items: [
// an array of objects
]
}
对于某个视图,比如一个简单的表格,我可能只需要 id 和 name。所以我暴露了一个宁静的端点,它给了我下面的结构
{
id: 1,
name: 'Cart 1'
}
其他一切都是不必要的。对于购物车编辑页面,我可能需要比 id 和名称更多的数据。问题是,如何构建一个 restful 端点来公开同一对象的这些不同表示?
【问题讨论】:
-
什么是“对象列表视图模型”和“对象详细视图模型”?它们是资源的表示吗?
-
它们是只暴露对象资源的某些属性的模型(所以我想它们可以被视为不同的资源?)。所以对象列表视图模型将只有对象的 id 和名称,但对象详细视图模型将具有 id 和名称以及其他东西的全部负载。
-
你能用更简单的例子,让没有
.NET经验的人都能理解吗? -
@Umair 您所描述的是同一资源的不同表示。资源是相同的,并且必须由 same URL 标识。可以使用内容协商来选择表示。
-
@Tichodroma,所以参考我上面给出的示例,我是否只需使用
/cart/1/list来获取列表视图模型?
标签: c# .net rest asp.net-web-api restful-url