RESTful API能否在一个请求中返回多个资源?

RESTful API能否在一个请求中返回多个资源?,rest,api,http,uri,Rest,Api,Http,Uri,我想在日历中显示事件,但事件来自API中的多个资源。在有效负载中执行返回多个资源的单一路由以避免调用多个路由(前端),这是一种不好的做法吗 例如,不打电话 GET/users/42/availabilities?minDate=1999-01-01&maxDate=2001-01-01 [{ startDate: '2000-01-01 00:00', endDate: '2000-01-01 01:00' }] [{ type: 'project-presentation',

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

例如,不打电话

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

[{
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]
[{
  type: 'project-presentation',
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]
{
  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'
  }],
}
GET/users/42/events?minDate=1999-01-01&maxDate=2001-01-01

[{
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]
[{
  type: 'project-presentation',
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]
{
  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'
  }],
}
我可以做一个路线,返回两个资源的结果吗?这是一种好的做法吗

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

[{
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]
[{
  type: 'project-presentation',
  startDate: '2000-01-01 00:00',
  endDate: '2000-01-01 01:00'
}]
{
  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'
  }],
}

谢谢

TL;医生:是的,请讲;要知道这是有后果的

较长的答案有点纠结。需要理解的重要一点是,资源与资源标识符是1:1。您在响应
get
请求时返回的消息体是该资源的表示

所以如果你从

/A
/B
您决定,对于某些需要粗粒度的用例,您可以引入一种新的资源

/A-and-also-B
其中
/A-和-A-B
的表示是
/A
的一些投影与
/B
的一些投影合并

假设媒体类型具有正确的片段语义,您甚至可以使用

/A-and-also-B#A
/A-and-also-B#B
以获得组合表示的A和B部分

然而,就REST客户机而言,
/a
/B
/a-and-allow-B
之间没有等价性。它们是三种不同的资源。它们使用不同的键进行缓存,使其中一个键无效不会影响其他键

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

PUT/ATL;医生:是的,请讲;要知道这是有后果的

较长的答案有点纠结。需要理解的重要一点是,资源与资源标识符是1:1。您在响应
get
请求时返回的消息体是该资源的表示

所以如果你从

/A
/B
您决定,对于某些需要粗粒度的用例,您可以引入一种新的资源

/A-and-also-B
其中
/A-和-A-B
的表示是
/A
的一些投影与
/B
的一些投影合并

假设媒体类型具有正确的片段语义,您甚至可以使用

/A-and-also-B#A
/A-and-also-B#B
以获得组合表示的A和B部分

然而,就REST客户机而言,
/a
/B
/a-and-allow-B
之间没有等价性。它们是三种不同的资源。它们使用不同的键进行缓存,使其中一个键无效不会影响其他键

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

非常感谢你的回复!现在更清楚了:)非常感谢您的回复!现在更清楚了:)