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

本文关键字:定型 宁静 | 更新日期: 2023-09-27 18:24:43

我一直在浏览这个博客,我理解他在说什么,特别是关于层次结构(沿着路径走回去(。

所以

/objects/1/property

删除property应该为您提供 id 为 1 的对象,删除 id 应该为您提供所有对象。优秀且合乎逻辑。

但我总是通过视图模型公开我的数据,所以,

/objects/list/1 将给我 ID 为 1 的对象的对象列表视图模型。或者/objects/detail/1会给我 id 为 1 的对象的对象详细信息视图模型。

使用这种方法,我最终得到了一个长结构,只是为了获得一个特定的视图模型! 即 objects/visualization/analysis/thread .这甚至令人不安吗?我似乎正在做的(下意识地!(是构建我的 restful API,以匹配这个特定视图模型所在的命名空间或模块(因此在 .NET 中它将是命名空间:app.models.object.visualization.analysis(。

如何最好地构建这样的 Restful 端点?有这样的东西更好吗

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 和名称。所以我公开了一个 restful 端点,它给我以下结构

{
    id: 1,
    name: 'Cart 1'
}

其他一切都是不必要的。对于购物车编辑页面,我可能需要比 id 和名称更多的数据。问题是,如何构建一个 restful 端点来公开同一对象的这些不同表示形式?

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

URI 是稳定的

资源由 URI 标识。获取 ID 为 1 的对象,执行

GET /objects/1

要获取所有对象的列表,只需

GET /objects

使用内容协商

服务器返回的对象 1 的表示形式由内容协商决定。这是使用 HTTP 标头完成的,而不是 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标头具有不同的值。

不要使用不同的 URI

不要执行以下任何操作:

  • GET /objects/1/list:这将从对象 1 请求名为 list子资源
  • GET /objects/1/list :这将请求另一个子资源。
  • GET /objects/1?model=detailGET /objects/1?model=list:这些是标识不同资源的不同URI。

尽量保持网址简单。这意味着,如果你的API是一所房子,你想要一个名叫Marie的人的所有衣服,你的URL将是:

API/persons/Marie/clothes

而不是:

API/house/persons/Marie/clothes/all

对不起,不好的例子。休息很难解释。