RESTful API是否可以在一个请求中返回多个资源?

时间:2019-08-05 11:41:59

标签: rest api http uri

我想在日历中显示事件,但是事件来自API中的多个资源。做一条路由返回有效负载中的多个资源以避免在前端调用多个路由是一种不好的做法吗?

例如,代替调用

获取/ users / 42 / availabilities?minDate = 1999-01-01&maxDate = 2001-01-01

[{
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]

GET / users / 42 / events?minDate = 1999-01-01&maxDate = 2001-01-01

[{
  type: 'project-presentation',
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]

我可以做一条路线来返回结果两个资源吗?这是个好习惯吗?

GET / users / 42 / calendar?minDate = 1999-01-01&maxDate = 2001-01-01

{
  availabilities: [{ // equivalent of GET /users/42/availabilities?minDate=1999-01-01&maxDate=2001-01-01
    startDate: '2000-01-01 00:00',
    endDate: '2000-01-01 01:00'
  }],
  events: [{ // equivalent of GET /users/42/events?minDate=1999-01-01&maxDate=2001-01-01
    type: 'project-presentation',
    startDate: '2000-01-01 00:00',
    endDate: '2000-01-01 01:00'
  }],
}

谢谢!

1 个答案:

答案 0 :(得分:0)

TL; DR:是的,请继续;注意会有后果。

更长的答案有些纠结。要了解的重要一点是,资源与资源标识符的比例为1:1。您为响应GET请求而返回的消息正文是那个资源的表示。

所以,如果您以

开头
/A
/B

并且您确定对于某些需要较粗粒度的用例,您可能会引入新的资源

/A-and-also-B

其中/A-and-also-B的表示形式是/A的某些投影与/B的某些投影合并。

假设media-type具有正确的片段语义,您甚至可以使用

/A-and-also-B#A
/A-and-also-B#B

获取组合表示的A和B部分。

但是-就REST客户端而言,/A/B/A-and-also-B之间没有对等关系。它们是三个不同资源。它们使用不同的密钥进行缓存,并且使其中一个密钥无效对其他密钥没有影响。

GET /A
GET /A-and-also-B
PUT /A <-- invalidates previously cached A, but does _not_ invalidate /A-and-also-B

将来,您更有可能看到/A-and-also-B,而不是/links-to-A-and-also-B。链接到其他资源的模式与Web一样古老(将html与图像一起使用,或按需编码)。发生变化的是Server Push的可能性-响应您对/links-to-A-and-B的请求,服务器可能还会 推送/A/B 。这样一来,您就可以返回多个资源。