使用 406 响应端点请求,然后调用另一个方法

Posted

技术标签:

【中文标题】使用 406 响应端点请求,然后调用另一个方法【英文标题】:Answer endpoint request with a 406 and then call another method 【发布时间】:2021-10-25 22:27:24 【问题描述】:

我有以下两难境地:我有一个端点,我必须检查其银行帐户是否有足够的钱来购买蒸汽代码,如果他/她有,我需要用 406(接受) 然后调用方法制作购买steam代码。

@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> steamRecharge(@RequestBody RequestDTO request) throws Exception 
        SteamRechargeService.checkIfClientHasEnoughMoneyOnAccount(request);
        return new ResponseEntity<>("Client has enough money", HttpStatus.ACCEPTED);
        SteamRechargeService.rechargeSteamAccount(request);

我知道这种方式行不通。如果我使用 javascript 编码,我会将此方法设为异步,然后等待 checkIfClientHasEnoughMoneyOnAccount(request);,然后异步调用方法 SteamRechargeService.rechargeSteamAccount(request);,然后返回 http 响应。

有没有办法在 Java 中做到这一点?

【问题讨论】:

查看baeldung.com/spring-async。您可以委托 rechargeSteamAccount 作为异步调用,而无需等待结果。 【参考方案1】:

按照 centrumek 的建议,我想出了这个答案。我创建了一个具有@EnableAsync 的@Configuration 类。控制器想出了类似的东西:

@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> steamRecharge(@RequestBody RequestDTO request) throws Exception 
    SteamRechargeService.checkIfClientHasEnoughMoneyOnAccount(request);
    SteamRechargeService.rechargeSteamAccount(request);
    return new ResponseEntity<>("Client has enough money", HttpStatus.ACCEPTED);
    

并且'rechargeSteamAccount'方法上有一个@async注解。

@async
public void rechargeSteamAccount(RequestDTO request)
...

这行得通,现在我正在发送 HttpStatus,我不需要等待“rechargeSteamAccount”结束它的过程。

【讨论】:

以上是关于使用 406 响应端点请求,然后调用另一个方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ktor 中调用内部端点?

如何在不使用请求的情况下直接从代码调用烧瓶端点

Spring Boot响应式WebClient调用遗留端点

Spring - 将一个端点的响应连接到另一个端点的请求

ESB + Camel根据前一次调用的响应调用多个Web服务

在AJAX调用中收到的响应显示在另一个HTML页面中