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

时间:2014-09-26 14:58:32

标签: c# .net rest asp.net-web-api restful-url

我一直在经历这个blog,我明白他在说什么,尤其是关于等级结构(沿着路径走回去)。

所以

/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)。 / p>

如何最好地构建这样的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和name。所以我公开了一个宁静的端点,它给了我以下结构

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

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

2 个答案:

答案 0 :(得分:3)

URI是稳定的

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

GET /objects/1

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

GET /objects

使用内容协商

服务器返回对象1的表示由内容协商决定。这是使用HTTP标头, URL路径段或查询参数完成的。这样做:

GET /objects/1
Accept: appliction/vnd.com.example.object.detail+json

通过这种方式,客户可以请求您称之为&#34;详细视图模型&#34;。

如果客户希望获得&#34;列表视图模型&#34;,您可以

GET /objects/1
Accept: appliction/vnd.com.example.object.list+json

注意

  • 两个请求的网址相同。
  • Accept标头具有不同的值。

不要使用不同的URI

不要做以下任何事情:

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

答案 1 :(得分:0)

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

API/persons/Marie/clothes

而不是:

API/house/persons/Marie/clothes/all

对不起的例子感到抱歉。休息很难解释。