宁静的网址。查看特定型号
Posted
技术标签:
【中文标题】宁静的网址。查看特定型号【英文标题】:Restful urls. View model specific 【发布时间】: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
来获取列表视图模型?
【参考方案1】:
URI 是稳定的
资源由 URI 标识。获取ID为1的对象,做
GET /objects/1
要获取所有个对象的列表,只需
GET /objects
使用内容协商
服务器返回对象1的表示由内容协商决定。这是使用 HTTP 标头、not URL 路径段或查询参数完成的。这样做:
GET /objects/1
Accept: appliction/vnd.com.example.object.detail+json
通过这种方式,客户可以请求您称之为“详细视图模型”的东西。
如果客户想获得“列表视图模型”,你可以这样做
GET /objects/1
Accept: appliction/vnd.com.example.object.list+json
注意
两个请求的 URL 相同。Accept
标头具有不同的值。
不要使用不同的 URIs
不要这样做:
GET /objects/1/list
:这将向对象 1 请求名为 list
的 子资源。
GET /objects/1/list
:这将请求另一个子资源。
GET /objects/1?model=detail
或 GET /objects/1?model=list
:这些是不同的 URI,用于标识不同的资源。
【讨论】:
【参考方案2】:尽量让您的网址尽可能简单。这意味着,如果您的 API 是一所房子,并且您想要一个名叫 Marie 的人的所有衣服,那么您的 URL 将是:
API/persons/Marie/clothes
而不是:
API/house/persons/Marie/clothes/all
对于不好的例子,我们深表歉意。休息很难解释。
【讨论】:
这不是我想要的!我不想给出衣服的每一个细节。例如,我只想在一种情况下提供设计师标签,在另一种情况下,我可能想提供设计师标签、购买日期、尺寸等。以上是关于宁静的网址。查看特定型号的主要内容,如果未能解决你的问题,请参考以下文章