API - 易于使用而且易于理解

时间:2018-03-22 13:46:41

标签: polymorphism naming-conventions api-design

我对网络应用程序中的可读性和可用性有一些疑问,但我无法找到我想要的答案。我将用一个例子来解释我的问题。

我的网络应用程序需要显示有关房屋,汽车和动物的一些信息。我有一个API端点,它返回所有项目,如:

[
  {
    "id": "1",
    "type": "car"
  },
  {
    "id": "2",
    "type": "house"
  },
  ...
]

到目前为止一切顺利,但现在我需要有关所有项目的更多信息。此信息作为参考(引用信息的ID字符串)存储并从API获取。房屋和汽车只能包含1个参考,动物可以包含1个或更多参考。

如何设置服务是不相关的,但API现在返回引用,如下所示:

[
  {
    "id": "1",
    "type": "car",
    "references": ["car1"]
  },
  ...
  {
    "id": "3",
    "type": "animals",
    "references": ["animal1", "animal3"]
  },
  ...
]

请注意,car item也会返回一个引用数组,但它只能包含一个引用!

此设置使我的JavaScript前端非常简单,它只是遍历所有项目,并且(如果需要)为每个引用执行另一个API调用。

问题1
我现在正试图弄清楚这是否是正确的方法,因为API错误地暗示汽车和房屋可以有多个参考。我有API文档可以清楚地解释它们不能,但我也喜欢一个不需要大量文档的API,因为它非常明显。

问题2
我的后端(用Java编写)有一个抽象的Item模型,其中包含idtype成员。 id属性只是一个随机字符串,type成员可以是housecaranimals。然后有resp。 3个子类名为HouseCarAnimal,每个子类都将type成员限制为自己的类型。在这些模型中实现引用的最佳方法是什么?

我可以在references模型上添加Item成员,这是一个数组。这样可以很容易地在前端显示。但是,如果API将按照问题1中的建议进行更改,那么它将更有意义:

  • Car模型提供carCar个参与
  • 的成员
  • House模型提供houseHouse个参与
  • 的成员
  • Animal模型提供animals成员Animal引用数组

导致类似:

[
  {
    "id": "1",
    "type": "car",
    "car": "car1"
  },
  ...
  {
    "id": "3",
    "type": "animals",
    "animals": ["animal1", "animal3"]
  },
  ...
]

但是这会给我一些前端的问题,试图找出它得到的模型,显示它等等。

希望我解释得对,如果有人能指出我正确的方向!

编辑我需要Item所有内容,而且返回的顺序也很重要。

1 个答案:

答案 0 :(得分:1)

您忘记了一种可能性:您不必暴露与您使用internaly相同的模型。 关于数据模型的更重要的事情是它背后的业务。那么问问自己,对于一个项目是否有参考感觉? 如果是,则在引用中添加List,否则在car中添加唯一引用,在动物中添加List。 至于JSON部分,它很大程度上取决于您请求的端点。您应该有一个端点的特定模型。如果你请求/ items,那么json数组的所有元素应该具有相同的模型。