我是否应该将所有api响应视为"资源"并返回一个JSON对象或简单数组也是合适的吗?
例如以下所有回复是否有效?
GET /rest/someresource
应该返回ID的集合
[{id:1},{id:2}]
{{id:1},{id:2}}
[1,2]
GET /rest/someresource?id>0
搜索大于零的ID并返回ID的集合
[{id:1},{id:2}]
{{id:1},{id:2}}
[1,2]
答案 0 :(得分:0)
可以返回一组资源 - 无论是id列表还是对象结构 - 这样的东西通常被称为“集合”。资源。
有关资源和馆藏的检查,请参阅http://51elliot.blogspot.com.au/2014/06/rest-api-best-practices-4-collections.html。
虽然REST不需要,但使用复数名词来引用集合资源是很常见的 - 例如
/rest/someresources
REST还需要使用已定义的媒体类型,并且有一些可用于协助集合,例如:
所有提供了一个定义的结构,用于为您的资源或集合中的每个资源包含超媒体链接 - 如果您正在执行REST,这是规范中您必须做的事情之一(即使很多人不喜欢和#39) ; t)的
对您提出的json结构的一些更具体的评论:
选项2无效json。考虑:
{{id:1},{id:2}}
json对象必须具有名称:值对,例如
{somename:{id:1},someothername:{id:2}}
会有效 - 但不是很有用!
另外 - 严格地说对于json,名称应该用引号括起来。如果值是字符串,则该值可以用引号括起来。
因此,如果您不想使用上面引用的常用媒体类型,则您的选项为1或3.应该是:
[{"id":1},{"id":2}]
[1, 2]
两者都有效,但是如果您决定将来要返回的不是id,则选项1将为您提供更多灵活性,以便为数组的每个元素添加更多属性。例如在未来的某个时候,您可能决定返回:
[{"id":1,"name":"fred"},{"id":2,"name":"wilma"}]
选项3只能返回一个id列表。
所以我个人会选择选项1.
答案 1 :(得分:0)
取决于你的目标RESTful。
除了@Chris Simon所说的,我还要补充一点,如果服务器只返回GET /rest/someresource
的ID,客户端必须重复调用类似GET /rest/someresource/{id}
的内容才能获取数据(它可以在UI上显示),对吗?这反过来只会增加服务器上的负载。如果id足够,你可以放弃提出的解决方案。
此外,一旦你决定你最好保持一致。
鉴于第二个选项甚至不是有效的,而且最后一个选项是非常有限的,我还会选择第一个选项JSON。
答案 2 :(得分:0)
为了说清楚我们在讨论同一资源的不同表示:
GET /rest/someresource
[{id:1},{id:2}]
和[1,2]
都是有效回复,但您应该明确要查看哪一个,例如:使用prefer header。因此,Prefer: return=minimal
您将返回[1,2]
,如果标题不存在,则[{id:1},{id:2}]
。只需确保vary header注册了prefer标头,否则您将遇到缓存问题。
按GET /rest/someresource?id>0
过滤您的收藏。因此,/rest/someresource?id>0
URI标识不同的过滤集合资源,或者它标识相同的集合资源,但是使用过滤器查询字符串,客户端指示它正在等待资源的过滤表示而不是完整表示。如果您不想使用首选标题,则可以使用最小代码表示相同内容:GET /rest/someresource?return=minimal
。
请注意,如果您希望客户端再次进行查询,则应在响应中向他们发送超链接。 REST客户端必须从这些超链接中获取URI(或URI模板),并且它不应该开始自己构建URI。