破坏 RESTful 设计或在一个 JSON 对象中获取两个表

本文关键字:对象 获取 两个 JSON 一个 RESTful 破坏 | 更新日期: 2023-09-27 18:33:57

我正在开发一个带有C#和.NET Framework 4.0的WCF RESTful Web服务。还有一个SQL Server数据库,我正在使用实体框架代码优先来访问它。

我在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实体。

破坏 RESTful 设计或在一个 JSON 对象中获取两个表

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

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

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

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

因此,下面是一个 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 是您的对象数组。