REST API 中的多态性 - 基于另一个字段的值响应中的不同数据类型



我有一个带有观察资源的REST API,其属性为observationType和observationValue。observationType的一些有效值有:HEART_RATE, BLOOD_PRESSURE, ORTHOSTATIC_BLOOD_PRESSURE。

根据observationType, observationValue字段可能包含不同的数据类型,HEART_RATE为整型,BODY_WEIGHT为双精度,blood _pressure为双精度。我们需要一些东西来显示收缩压和舒张压的值,像这样:

{
"observationType": "HEART_RATE"
"observationValue": 90
}
{
"observationType": "BODY_WEIGHT"
"observationValue": 81.5
}
{
"observationType": "BLOOD_PRESSURE"
"observationValue": {"systolicBloodPressureValue": 120, "diastolicBloodPressureValue": 80}
}

在REST API中建模的好方法是什么?,我不期望实现它的最佳选择,但通常我们如何实现它?这个行业有哪些模式?

我应该只是返回一个字符串值为observationValue?

看起来在REST API中拥有多态性会是一种混乱。

实现这一点的一种方法是使用Jackson的多态类型支持。将数据建模为:

public interface Observation<T> {
T getObservationValue();
}

并实现它,例如:

public class HeartRateObservation implements Observation<Integer> {
private Integer observationValue;
public void setObservationValue(Integer value) {
this.observationValue = value;
}
@Override
public Integer getObservationValue() {
return observationValue;
}
}
public class BodyWeightObservation implements Observation<Float> {
// ...
}
public class BloodPressureValue {
private float systolicBloodPressureValue;
private float diastolicBloodPressureValue;
// other members, getters and setters
}
public class BloodPressureObservation implements Observation<BloodPressureValue> {
// ...
}
现在是Jackson特有的部分:您必须指示Jackson使用类型info来(反)序列化您的类。将之前的模型修改如下:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,          // (1)
include = JsonTypeInfo.As.PROPERTY,  // (2)
property = "observationType"         // (3)
)
public interface Observation<T> { ... }

并将名称添加到实现中:

@JsonTypeName("HEART_RATE")            // (4)
public class HeartRateObservation implements Observation<Integer> { ... }
@JsonTypeName("BODY_WEIGHT")
public class BodyWeightObservation implements Observation<Float> { ... }
@JsonTypeName("BLOOD_PRESSURE")
public class BloodPressureObservation implements Observation<BloodPressureValue> { ... }

配置可以解释为:

  1. 使用自定义名称来标识确切的子类型…
  2. …把它放到对象的属性中…
  3. …(属性是)叫做observationType
  4. …对于HeartRateObservation类型,其值为"HEART_RATE"

免责声明1:我还没有运行代码,它可能需要一些调整,如果遇到问题请告诉我。

免责声明2:这是使用Jackson的一种方法——我承认我不知道你是否在使用Jackson。还有其他有效的解决方案。

最新更新