破坏 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 对象吗?(混合来自 user
和thought
表的列(。
{
"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 - 只要该资源的行为是 REST完全一致的。例如,如果您愿意,则可以完全展开thought
实体内的user
- 尽管您在此处存在潜在的冲突,因为您可能不希望用户在向thought
提交编辑时尝试更改user
的属性。
或者,您可以完全通过不同的资源集合公开扩展的实体(为了参数http://myhost/thoughtview
(,这可以是资源的只读集合。 如果选择此路由,则值得公开user
和thought
的规范 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 是您的对象数组。