【问题标题】:Send Response of Rest Api after some time一段时间后发送 Rest Api 的响应
【发布时间】:2022-10-20 21:26:24
【问题描述】:

我有一个rest api v1/create/order。我需要实现以下

  • 客户端 A -> 调用我的创建订单休息 api。
  • 我需要立即向客户返回确认
  • 然后我会在后台做一些处理。它需要 大约 50 到 200 秒)。
  • 一旦我完成了第 3 步。我需要返回 response.Result 将有一些我在步骤 3 中所做的计算字段。

我该如何实施? 我正在使用 Java 8 和 Spring Boot 框架。我可以在后台线程中执行第 3 步,因为它涉及一些并行操作。

【问题讨论】:

    标签: java spring multithreading spring-boot asynchronous


    【解决方案1】:

    我认为这个“用例”应该面对异步行为。 在 REST api 中建模异步场景没有“标准解决方案”,据我所知,上面列出的两个是唯一的。

    您应该公开两个休息端点

    1. /v1/create/order (or even better POST /v1/order... )
    
    2. /v1/order/{id} 
    

    第一个为 ex 返回一个 id。标识资源服务器端的“123”甚至更好的链接(更“REST”),如下所示:

    /v1/order/123
    

    请注意,服务器应返回 HTTP 202 以指示操作已“接受”,并可能添加 Retry-After 标头以指示客户端必须在指定时间或日期之前调用此 uri(在本例中为 2 秒)

    HTTP/1.1 202 (Accepted)
    Location /v1/order/123
    Retry-After: 2
    

    然后您(2s 后)从您的客户端定期调用:

    GET /v1/order/123
    

    直到你得到结果。

    另一种解决方案可能是从客户端 A 公开一个 api(如果可能的话),这样服务器可以在完成工作时调用客户端 A。 (如果客户端 A 本身就是一个服务,这是可能的)。 请注意,回调解决方案可以显着增加系统的复杂性,在某些情况下是可取的。

    【讨论】:

    • 是的。我想到了两种方法。似乎没有标准的方法来做到这一点
    • 是的,我更新了答案以更准确。
    【解决方案2】:

    您想要的是服务器发送事件的用例。 REST 遵循请求-响应周期。在这种情况下,您可以使用长轮询在初始响应后重新请求并保持连接等待第二个响应。

    【讨论】:

    • 长轮询会阻塞线程
    猜你喜欢
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2018-01-07
    • 1970-01-01
    • 2018-01-30
    • 2017-09-20
    相关资源
    最近更新 更多