如何发出仅更新提供的字段的POST请求?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何发出仅更新提供的字段的POST请求?相关的知识,希望对你有一定的参考价值。

我正在尝试使用仅更新提供的字段的json数据发布请求。目前,当我在请求正文中没有提供字段时,它将重置为默认值。

当我寄这个:

{
    "id": 59706975,
    "maxRiskDollars": 1000,
    "maxRiskCashPercent": 0.01
}

我收到了这个回复

{
    "id": 59706975,
    "maxRiskDollars": 1000,
    "maxRiskCashPercent": 0.01
}

然后我发送这个:

{
    "id": 59706975,
    "maxRiskCashPercent": 0.02
}

得到这个:

{
    "id": 59706975,
    "maxRiskDollars": 50,
    "maxRiskCashPercent": 0.02
}

(50是maxRiskDollars的默认值)

如何在JSON请求中未提供字段时使maxRiskDollars保持前一个值?

编辑:根据要求提供后端代码 - 这是JAVA / SPRING / HIBERNATE

控制器:

@PostMapping("/tradeManagers")
TradeManager newTradeManager(@RequestBody TradeManager newTradeManager) {
    return tradeManagerRepo.save(newTradeManager);
}

库:

@Repository
public interface TradeManagerRepo extends CrudRepository<TradeManager, Long>{

}
答案

要更新数据,根据REST标准,理想情况下会进行PATCH或PUT HTTP调用。我假设你只想更新json中提供的字段,它更像是一个PATCH。

在REST控制器中,您可以接受Map<String, Object>,它只包含应该更新的字段。 PATCH或PUT URL应具有需要更新的资源的id。使用FindById()从repo中获取原始对象

然后,您可以使用类似Apache BeanUtils(或Spring提供的任何类似库)来复制源中的属性,即Map到目标Object。

@PatchMapping("/tradeManagers/{tradeManagerId}")
Map<String, Object> newTradeManager(@RequestBody Map<String, Object> tradeManagerMap, 
    @PathVariable(name = "tradeManagerId") String trademanagerId) {
    Trademanager  tradeManger = tradeManagerRepo.findById(tradeManagerId);
    BeanUtils.copyProperties(trademanager, tradeManagerMap);
    return tradeManagerMap;
}

以上是关于如何发出仅更新提供的字段的POST请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OKHTTP 发出 post 请求?

如何在反应中使用 axios 发出 POST 请求?

如何在 Vuex 中通过 POST 请求发送状态数据?

如何发出json post请求?

如何使用 React Redux 发出 post 请求?

如何在 Swift 中发出 NSURLSession POST 请求