我目前(我尝试)为社交网络设计RESTful API。但我不确定我目前的方法是否仍符合RESTful原则。如果有些明亮的脑袋可以给我一些提示,我会很高兴。
假设以下URI表示用户帐户的名称字段:
people/{UserID}/profile/fields/name
但是有几百个可能的领域。所以我希望客户端创建自己的字段视图或使用预定义的视图。假设以下URI表示包含字段“name”,“age”,“gender”的预定义字段视图:
utils/views/field-views/myFieldView
因为字段视图是一种更高的逻辑,所以我不想将对字段视图的支持混合到“people / {UserID} / profile / fields”资源中。相反,我想做以下事情:
utils/views/field-views/myFieldView/{UserID}
假设我们想要执行一些数量的操作(希望这是英文的正确名称)。我们有以下URI,而每个URI都指向一个人员列表 - 他们的朋友:
GET people/exampleUID-1/relationships/friends
GET people/exampleUID-2/relationships/friends
现在我们想知道他们的哪些朋友也是我的朋友。所以我们这样做:
GET people/myUID/relationships/intersections/{Value-1};{Value-2}
“{Value-1/2}”是“people / exampleUID-1 / friends”和“people / exampleUID-2 / friends”的网址编码值。然后我们回来代表所有三个人的朋友。
尽管Leonard Richardson& Sam Ruby在他们的书“RESTful Web Services”中指出RESTful设计在某种程度上就像是一种“极端面向对象”的方法,我认为我的方法是面向对象的,因此符合RESTful原则。或者我错了吗?
何时不是:在小心使用时,为了避免基于查询的REST-RPC混合,这种“面向对象”的方法是否会受到鼓励?
感谢您提前的反馈,
peta
答案 0 :(得分:3)
我从未使用过REST,但我认为在'''/ people / {UserId} / profile'''中获取配置文件资源会产生XML或JSON等文档,包括所有领域。客户端然后我会忽略我不感兴趣的字段。是不是比(a)在服务器上配置个性化视图或(b)提出大量请求来获取每个字段要好得多? / p>
答案 1 :(得分:2)
你好,
我现在仍在阅读RESTful Web Services
,但我建议采用的方法略有不同。
关于帖子的第一部分:
utils/views/field-views/myFieldView/{UserID}
我不认为这是RESTful,因为utils
不是资源。定义自定义视图是可以的,但是这些视图应该是(imho)API的URI方案的自然组成部分。要将上述内容合并到您的第一个URI示例中,我建议使用以下示例之一,而不是为其创建特殊视图:
people/{UserID}/profile/fields/name,age,gender/
people/{UserID}/profile/?fields=name,age,gender
后一个示例将fields
视为算法的输入值。这可能是比在URI中使用fields
更好的方法,因为它不是资源本身 - 它只是对people/{UserID}/profile/
的现有视图施加约束。从技术上讲,它与分页非常相似,默认情况下您会限制视图,并允许客户使用?page=1
,?page=2
等浏览资源。
关于帖子的第二部分:
这是一个更难破解的问题。
第一:
在URI中使用intersection
会破坏您的URI方案。它本身不是一种资源,它与friends
处于同一水平,而它更适合于你的算法的一个级别或者作为输入值,即
GET people/{UserID}/relationships/friends/intersections/{Value-1};{Value-2}
GET people/{UserID}/relationships/friends/?intersections={Value-1};{Value-2}
我再次个人倾向于后者,因为与第一种情况类似,你只是限制people/{UserID}/relationships/friends/
的现有观点
其次,关于:
而“{Value-1/2}”是网址 编码值 “人/ exampleUID-1 /朋友”和 “人/ exampleUID-2 /朋友”
如果你的意思是{Value-1/2}
包含所提到的GET请求的整个编码响应,那么我会避免这种情况 - 我不认为这是RESTful方式。由于friends
本身就是一种资源,您可能希望将其公开并直接访问它,即:
GET friends/{UserID-1};{UserID-2};{UserID-3}
这里需要注意的一件重要事情 - 我在上一个示例中的用户ID之间使用了;
,而我在上面的,
示例中使用了fields
。原因是两者都代表不同的运营商。在第一种情况下,我们需要OR
(,
)以获取所有三个字段,而在上一个示例中,我们必须按顺序使用AND
(;
)得到一个十字路口。
使用两种类型的运算符会使API设计过于复杂,但最终应该提供更大的灵活性。
答案 2 :(得分:0)
感谢您的澄清答案。它们正是我所要求的。不幸的是,我没有时间从封面到封面阅读“RESTful Web Services”;但我会尽快赶上来。 : - )
使用{Value-1/2}
我只表示URI的url编码值 - 而不是它们的响应数据。 :)在这里,我倾向于你的第二个例子。这里显而易见的是,在计算相交的朋友时,在引擎盖下会调用算法。除此之外,我可能会为它添加一些进一步的操作。
peta