【问题标题】:Breaking RESTful design or getting two tables in one JSON object破坏 RESTful 设计或在一个 JSON 对象中获取两个表
【发布时间】:2013-10-03 14:01:12
【问题描述】:

我正在使用 C# 和 .NET Framework 4.0 开发 WCF RESTful Web 服务。还有一个 SQL Server 数据库,我使用 Entity Framework Code First 来访问它。

我在 SQL Server 上有这两个表:

我的应用程序用户的用户表。

User
{
   userId,
   name,
   country
}

还有一张桌子来存储他们对某事的想法。

Thought
{
   thoughtId,
   userId,
   description,
   date
}

现在,我想在 iPhone 上显示UITableView 这些想法按日期排序。 UITableViewCell 将是这样的:

User.name
Thought.description
Thought.date

我可以这样返回 JSON 对象吗?(混合来自 userthought 表的列)。

{
    "thoughtId": "1",
    "userId": "12",
    "name": "John",
    "description": "I'm thinking about you",
    "date": "12/12/2012"
}

或者,在一次 GET 调用中获取此信息的最佳方式是什么?

最后,它的 URI 是什么? http://myhost/users/...http://myhost/thoughts/...

我在某处读到,如果我使用http://myhost/users/...,我只能返回user 实体。

【问题讨论】:

  • 您可以通过创建一个类来做到这一点,比如UIViewDTO,其中 DTO 代表数据传输对象。这个类将包含所有必需的属性,它们是thoughtId、userId、name、description、date。

标签: c# json entity-framework rest


【解决方案1】:

将复合实体作为资源返回没有任何非 RESTful 风格 - 只要该资源的行为是 REST 完全一致的。例如,如果您愿意,您可以在您的 thought 实体中完全展开 user - 尽管您可能不希望用户尝试更改,因此这里存在潜在冲突user 在向 thought 提交编辑时的属性。

或者,您可以完全通过不同的资源集合公开扩展实体(为了论证http://myhost/thoughtview),这可能是资源的只读集合。如果您选择此路线,那么值得公开 userthought 的规范 Uri,以便客户端可以在需要时轻松编辑源对象。

请记住,在您设计 REST API 时,服务返回的实体结构不必与您在后台存储的数据结构相匹配。确保您的服务在 API 级别有意义,并且不要按照您认为需要在幕后存储数据的方式来设计您的服务。

【讨论】:

    【解决方案2】:

    我猜你在用户和想法之间有一对多的关系。

    所以这里有一个 LINQ 查询,它将为您提供一个代表您想要的对象:

    var query = User.Join
        (
            Thought,
            x=>x.userId,
            x.userId,
            (u,t)=>new 
            {
                t.thoughtId,
                u.userId,
                u.name,
                t.description,
                t.date
            }
        )
    

    然后你可以使用类似Newtonsoft JSON.Net 的东西作为 Nuget 包将这个匿名类转换为 JSon 对象。

    一个例子是:

    string json = JsonConvert.SerializeObject(query);
    

    现在字符串 json 是您的对象数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 2020-10-13
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多