【问题标题】:REST API Best Practices for Hierarchical JSON Objects [closed]分层 JSON 对象的 REST API 最佳实践 [关闭]
【发布时间】:2021-09-15 13:51:23
【问题描述】:

想象一个简单的例子,比如实现了 CRUD 方法的“Vehicle Make and Model”REST API。

车辆制造与型号之间的关系是 1:N。一个汽车品牌可以有 N 个车型,但一个车型只关联一个品牌。

我们的 CRUD 方法:

  • POST/PUT 车辆/品牌:创建或更新有关一个车辆品牌的基本信息。
  • GET 车辆/品牌:获取车辆品牌列表。
  • 获取车辆/品牌/{id}:获取特定车辆品牌及其信息。
  • POST/PUT 车辆/品牌/{id}/models:创建或更新有关一种车辆模型的基本信息。
  • GET vehicle/makes/{id}/models:获取特定品牌的车辆型号列表。
  • GET vehicle/makes/{id}/models/{id}:获取特定品牌的特定车型。

问题是:

GET makes or makes/{id} 是否应该在其中返回他们的模型列表?或者,是否应该仅在特定请求中返回模型?

我必须考虑在我的 API 中返回或不返回嵌套信息?


这个例子很简单,但是场景可以通过很多层次依赖的方式进行扩展,比如:

车辆 ├── 车辆制造 │ ├── 车辆型号 │ └── ... ├── 轮胎 │ └── 轮胎品牌 │ ├── 轮胎模型 │ └── ... └── ... └── ...

【问题讨论】:

  • 我在一家公司工作,我们实际上有车辆查找服务,并且有类似的休息 API 格式。对我们来说,vehicle/makes/{id} 什么也不返回,它对我们来说不是一个有效的端点,因为没有任何特定于 make 的东西。您需要搜索模型以获取模型列表,因此您将执行vehicles/makes/{id}/models。有趣的是它应该是vehicle/make/{id}/models。还记得您请求的资源是 Singleton 还是 Collection? models 将返回一个集合,model 将返回一个单例。
  • 也许您想查看graphql,因为我猜图表更适合您的用例。
  • @Popeye 我试图保留其余的概念。一个好的做法是在资源路径上使用复数:good-restful-url-examples
  • @Shahriar 不幸的是,graphql 不是该项目的选项;(
  • 我认为这是一个很好的问题,但是它征求的答案可能是基于意见的(SO 题外话),我想知道另一个 StackExchange 站点是否更合适(?)...这是我在考虑 REST API 时经常遇到的问题。

标签: java json rest


【解决方案1】:

好吧,这取决于。

这些 API 的使用者是谁?如果是您自己的 UI、其他服务或直接客户?

目的是减少服务器调用次数。 如果服务的使用者每次都进行多次调用以获取所需的数据,则应将其嵌套到单个响应中。 如果您的 UI 正在使用延迟加载,或者其他消费者有条件地需要这些数据,那么请隔离到多个 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2020-12-24
    • 2014-04-07
    • 2015-11-17
    • 2013-10-23
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多