首页 > 解决方案 > RESTful Web 服务客户端 - 传递对象或仅传递对象的 id

问题描述

我有一个带有端点 ( /car) 的 Web 服务应用程序,它返回存储在数据库中的可用汽车列表。然后同一个应用程序有另一个端点,它返回给定日期的汽车价值。

当请求汽车的价值时,客户端应该传入汽车ID列表还是汽车对象列表?例如,使用 Spring REST 控制器:

@RestController
@RequiredArgsConstructor
@RequestMapping("/car-value")
public class CarValueController {
    
    private final CarRepository carRepo;
    private final SportsCarClient sportsCarClient;
    private final StandardCarClient standardCarClient;

    @GetMapping
    public Map<Long, BigDecimal> getTotalReturn(Set<Long> carIds, LocalDate valuationDate) {
       
       List<Car> cars = carRepo.findAllById(carIds);
       BigDecimal value;
       for (Car car: cars) {
           if (car.getType().equals(CarType.SPORTS_CAR)) {
              //get from value from sports car service
              value = sportsCarClient.getValue(car.getVin());
           } else {
              value = standardCarClient.getValue(car.getStandardId());
           }
           // put value in map
       }
       //return map
}

或者

@RestController
@RequiredArgsConstructor
@RequestMapping("/car-value")
public class CarValueController {
    
    private final SportsCarClient sportsCarClient;
    private final StandardCarClient standardCarClient;

    @PostMapping
    public Map<Long, BigDecimal> getTotalReturn(@RequestBody Set<Car> cars, LocalDate valuationDate) {
       
       BigDecimal value;
       for (Car car: cars) {
           if (car.getType().equals(CarType.SPORTS_CAR)) {
              //get from value from sports car service
              value = sportsCarClient.getValue(car.getVin());
           } else {
              value = standardCarClient.getValue(car.getStandardId());
           }
           // put value in map
       }
       //return map
}

这个问题与这篇文章类似。我相信一些相关的差异是:

  1. 客户端是另一个 Web 服务,尽管位于同一台物理机器上,并且由相同的开发人员维护。
  2. 具有 /car 和 /car-value 端点的应用程序连接到包含汽车信息的数据库(即Car实体)。
  3. 有些客户不需要汽车类型、VIN 或标准 ID。因此,他们通常不会在从/car. 如果他们将Car对象传递给 /car-value,他们将不得不开始存储这些值。他们需要知道这些值用于获取汽车价值。

标签: javaweb-servicesoopdesign-patterns

解决方案


推荐阅读