2010-05-28 89 views
14

我有一个资源最佳实践结果

/system/resource 

我想请问系统有关资源的布尔问题无法通过 处理在客户端上回答(即我可以” t只需获取资源 并查看实际资源数据 - 它需要使用客户端不可用的数据在后端处理 )。例如

/system/resource/related/otherresourcename 

我想这是返回true或false。有没有人有任何 这种交互类型的最佳实践例子?

可能性,来我的脑海:

  • 使用的HTTP状态代码,没有返回体(闻错)

  • 返回纯文本字符串(真,假,1,0) - 不知道什么字符串值都适合使用,而且 这似乎被忽略了接受媒体类型和总是返回 纯文本

  • 为我的每种支持媒体类型 提供了一个布尔对象,并返回适当的类型(带有单个布尔值 结果的JSON文档,一个具有单个布尔字段的XML文档)。然而这看起来很笨拙。

我并不特别想进入有关 的RESTful系统等的真正含义进行了长时间讨论 - 我已经使用这个词REST的称号,因为它 最能表达系统的一般的味道,我正在设计(即使我可能更倾向于通过网络而不是真正的REST)。但是,如果有人对某个真正的RESTful系统完全避免这个问题有一些想法,我很乐意听到他们的意见。

+0

您能否让标签更容易混淆和更具体? – WhirlWind 2010-05-28 01:55:14

+0

是的,抱歉 - 真的不知道该怎么标记问题。我专门用MVC.NET来做,但这个问题肯定适用于任何类似REST的系统? – 2010-05-28 02:08:10

回答

3

我认为返回文本/纯文本将是最干净的选项。就accept头而言,如果客户端真的无法处理纯文本,那么您可以恢复为Json或Xml。
个人而言,我会使用字符串“true”和“false”。大多数客户端语言可以将这些字符串解析为适当的值。

+0

我同意他们不可能处理文本计划,但在API的其余部分,他们可以通过使用他们想要的单一Accept类型逃脱 - 即在我的很多测试中,我使用restclient,并将Accept设置为应用程序/ JSON。在这种情况下,我真的必须返回包装的布尔JSON不是吗? – 2010-05-28 02:26:20

+0

是的,根据'http:// tools.ietf.org/html/rfc2616#section-14.1',如果你的客户端没有说它支持text/plain,那么你不应该发送它。 – 2010-05-28 03:46:02

5

嗯,很难回答(你的例子有点太抽象了)。

通常你可以设计这样的布尔信息作为资源数据或专用资源。订单领域的例子,当你想知道订单是否完成(布尔问题)。当心这是简化的例子(订单的世界要复杂得多;)

设计订单状态数据有效载荷

HTTP调用: HTTP GET /orders

会给你回200 OK与有效载荷(JSON格式): { id : "1" , completed : "true" }

设计订单状态,资源

HTTP调用: HTTP GET or HEAD /orders/completed/1

现在,让你的“布尔”的回答,您可以检查HTTP响应状态是否是404或200 400会告诉订单尚未完成,200会告诉它完成。

为了更好地帮助您,您必须更加具体,具体是什么“布尔问题”?什么是真正的资源和相关资源?

+0

Manuel,谢谢你的深思熟虑的评论。 想象一下,我们有一个资源'john',另一个资源'bob'。这两个都有属性,如姓名,地址,出生日期,朋友名单等。 因此,他们都是'资源'喜欢,并可以在宁静的架构中获取GET 。 但是我想问一个关于这两个资源之间关系的布尔问题。实际的关系很简单(即,我可以通过其他人的朋友到达一个人),但显然涉及服务器端的一些计算。 所以我想问问 HTTP GET/bob/isrelated/john – 2010-05-31 01:06:50

+0

我可以想到两种可能性:1)在/ bob/friends上做一个GET并检查john是否是响应中的一个项目。或者走得更远,做GET/bob/friends/john,如果你得到了404,那么他们之间没有友谊,否则200。 2)将此信息直接包含到资源中:GET/bob,然后在内搜索鲍勃约翰...。如果约翰是回应的一部分,那么就有一种关系,否则就是这样。从休息的角度来看,我不会直接想到服务器计算术语(它是api实现细节)。 – 2010-05-31 20:26:01

+0

是的,我同意如果我的'关系'是可以表达的,我只是将它们包含在资源中。我的意思是涉及到计算服务器上的资源可能有成千上万的相关资源(这是一个复杂网络的完全传递闭包)。因此,这种关系是否依赖于无法发送给客户端的数据 - 它必须由服务器计算 – 2010-06-01 08:31:22