休息api响应格式

时间:2016-09-21 10:19:46

标签: json rest api resources restful-architecture

我是否应该将所有api响应视为"资源"并返回一个JSON对象或简单数组也是合适的吗?

例如以下所有回复是否有效?

GET /rest/someresource应该返回ID的集合

  1. [{id:1},{id:2}]
  2. {{id:1},{id:2}}
  3. [1,2]
  4. GET /rest/someresource?id>0搜索大于零的ID并返回ID的集合

    1. [{id:1},{id:2}]
    2. {{id:1},{id:2}}
    3. [1,2]

3 个答案:

答案 0 :(得分:0)

收集资源

可以返回一组资源 - 无论是id列表还是对象结构 - 这样的东西通常被称为“集合”。资源。

有关资源和馆藏的检查,请参阅http://51elliot.blogspot.com.au/2014/06/rest-api-best-practices-4-collections.html

虽然REST不需要,但使用复数名词来引用集合资源是很常见的 - 例如

/rest/someresources

REST还需要使用已定义的媒体类型,并且有一些可用于协助集合,例如:

  • Collection+json
    • 提供一个结构,其中包含项目列表周围的元数据,其中您将每个项目的结构定义为您的资源
  • HAL
    • 提供具有嵌入式集合和嵌入式资源的结构

many more

所有提供了一个定义的结构,用于为您的资源或集合中的每个资源包含超媒体链接 - 如果您正在执行REST,这是规范中您必须做的事情之一(即使很多人不喜欢和#39) ; t)的

您提出的Json结构

对您提出的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。