【问题标题】:Should I provide different views on the same REST entity?我应该对同一个 REST 实体提供不同的视图吗?
【发布时间】:2013-09-13 13:48:43
【问题描述】:

我看到这表明我可以根据用户构建不同的视图: different json views for the same entity

但是在 asp web api 中,使用模型类,我不能随便添加新属性。

所以,例如我可能有 uri:

http://host/api/products/id

返回模型:

public class Product{
   public string Code { get; set; }
   public string Description { get; set; }
}

但出于另一个目的,我想添加更多信息,假设这很昂贵,因为它会加入其他数据来构建模型,或者以非常特定的方式格式化数据:

http://host/api/productsspecial/id

返回模型:

public class ProductSpecial{
   public string Code { get; set; }
   public string Description { get; set; }
   public decimal Price { get; set; } //assume expensive to look up
}

显然我有办法做到这一点,两个不同的控制器,返回不同的数据视图。我的问题是,这样可以吗还是有更好的方法?

无论如何我都可以这样做:http://host/api/products/id?includeprice=true 并使用它来返回替代模型?这是个好主意吗?

【问题讨论】:

    标签: rest asp.net-web-api


    【解决方案1】:

    我建议

    GET /host/api/products/{id}?fields=code,description,price
    

    您应该避免以您描述的方式使您的资源 URL 复杂化。每个可能的值配置都需要一个新名称:“productsReallySpecial”等。

    ?includePrice=true 的问题在于,您可能希望为每个变量设置一个参数,使其成为可选的。您的文档可以列出默认返回值和可用的返回值。

    【讨论】:

    • 谢谢,当我不使用任何类型的 json 编写器构建此响应时,我将如何实现过滤,我只有自动序列化的模型类?
    • 好吧,您要么必须使用 JSON 编写器,要么需要一个包含所有属性的模型类,并且只填充用户请求的那些。这样您就可以节省昂贵的工作量,而序列化将做正确的事情。
    • “做正确的事”?意味着它将排除null 属性?我的例子是decimal,但我想我还是可以使用decimal?
    • 我不能 100% 确定它将如何序列化 - 是否会完全排除该属性或具有属性名称但没有值。我相信它将完全排除该财产。尝试一下并看看会发生什么应该很容易。
    • 谢谢,我可以控制 json 序列化程序的格式以忽略 nulls 使用这里的技术:stackoverflow.com/questions/12629144/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多