Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Restful URL。视图模型特定_C#_.net_Rest_Asp.net Web Api_Restful Url - Fatal编程技术网

C# Restful URL。视图模型特定

C# Restful URL。视图模型特定,c#,.net,rest,asp.net-web-api,restful-url,C#,.net,Rest,Asp.net Web Api,Restful Url,我已经经历了这一切,我理解了他所说的,特别是关于层次结构(沿着路径往回走) 所以 删除property应为您提供id为1的对象,删除id应为您提供所有对象。很好,逻辑性很强 但我总是通过视图模型公开数据,所以 /objects/list/1将为我提供id为1的对象的对象列表视图模型。或者/objects/detail/1将为id为1的对象提供对象详细视图模型 使用这种方法,我得到了一个很长的结构,只是为了得到一个特定的视图模型!即对象/可视化/分析/线程。这是不是很安静?我似乎(下意识地!)正在

我已经经历了这一切,我理解了他所说的,特别是关于层次结构(沿着路径往回走)

所以

删除
property
应为您提供id为1的对象,删除id应为您提供所有对象。很好,逻辑性很强

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

/objects/list/1
将为我提供id为1的对象的对象列表视图模型。或者
/objects/detail/1
将为id为1的对象提供对象详细视图模型

使用这种方法,我得到了一个很长的结构,只是为了得到一个特定的视图模型!即
对象/可视化/分析/线程
。这是不是很安静?我似乎(下意识地!)正在构造我的restful API,以匹配这个特定视图模型所在的名称空间或模块(因此在.NET中它将是名称空间:app.models.object.visualization.analysis)

如何最好地构造这样一个restful端点?有这样的东西更好吗

对象列表/1
对象详细信息/1

谢谢

例子: 对不起,我应该说得更清楚些。我将给出一个.NET示例。假设我有一个cart类

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; }
}

对于某个视图(如简单表),我可能只需要id和名称。因此,我公开了一个restful端点,它将返回以下结构

{
    id: 1,
    name: 'Cart 1',
    lastUpdated: '26-Sep-2014 16:51:23',
    items: [
       // an array of objects
    ]
}
{
    id: 1,
    name: 'Cart 1'
}

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

请尽量保持URL的简单性。这意味着,如果您的API是一所房子,并且您想要一个名叫玛丽的人的所有衣服,那么您的URL将是:

API/persons/Marie/clothes
而不是:

API/house/persons/Marie/clothes/all
对不起,这些不好的例子。Rest很难解释。

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=detail
    GET/objects/1?model=list
    :这些是识别不同资源的不同URI

什么是“对象列表视图模型”和“对象详细视图模型”?它们是资源的表示吗?它们是仅公开对象资源的某些属性的模型(所以我认为它们可以被视为不同的资源?)。因此,对象列表视图模型将只具有对象的id和名称,而对象详细视图模型将具有id和名称以及所有其他内容。您能否使用更简单的示例,以便没有
.NET
经验的任何人都能理解它们?@Umair您描述的是同一资源的不同表示。资源是相同的,必须由相同的URL标识。可以使用内容协商来选择表示。@Tichodroma,因此参考我在上面给出的示例,我是否可以执行
/cart/1/list
来获得列表视图模型?这不是我想要的!我不想透露衣服的每一个细节。例如,我只想在一种情况下给设计师标签,在另一种情况下,我可能想给设计师标签,购买物品的日期,尺寸等。
GET /objects
GET /objects/1
Accept: appliction/vnd.com.example.object.detail+json
GET /objects/1
Accept: appliction/vnd.com.example.object.list+json