宁静的网址。查看特定型号

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/1objects-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-viewcarts-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=detailGET /objects/1?model=list:这些是不同的 URI,用于标识不同的资源。

【讨论】:

【参考方案2】:

尽量让您的网址尽可能简单。这意味着,如果您的 API 是一所房子,并且您想要一个名叫 Marie 的人的所有衣服,那么您的 URL 将是:

API/persons/Marie/clothes

而不是:

API/house/persons/Marie/clothes/all

对于不好的例子,我们深表歉意。休息很难解释。

【讨论】:

这不是我想要的!我不想给出衣服的每一个细节。例如,我只想在一种情况下提供设计师标签,在另一种情况下,我可能想提供设计师标签、购买日期、尺寸等。

以上是关于宁静的网址。查看特定型号的主要内容,如果未能解决你的问题,请参考以下文章

通过特定网址在Twitter上接收新帖子的通知

华为平板上如何查看官网源代码

如何在 Laravel 的 Blade 模板中链接到一个宁静的资源?

Htaccess将特定网址重定向到另一个网址的路径

利用php实现:当获取的网址不是特定网址时候跳转到指定地址

Scrapy LinkExtractor特定网址