0

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

4

2 回答 2

3

将复合实体作为资源返回没有任何非 RESTful 风格 - 只要该资源的行为是 REST 完全一致的。例如,如果您愿意,您可以完全扩展user您的实体内部thought——尽管您可能不希望用户在提交对 a 的编辑时尝试更改a 的属性。userthought

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

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

于 2013-10-03T14:46:09.010 回答
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 是您的对象数组。

于 2013-10-03T14:07:34.940 回答