【问题标题】:RESTful API - chunked response for bulk operationRESTful API - 批量操作的分块响应
【发布时间】:2015-04-30 08:49:59
【问题描述】:

我正在开发一个类似 REST 的 API,它将支持对某些资源的批量操作。由于完成这样的请求可能需要一些时间,我想在分块响应中返回操作的状态。媒体类型应为 JSON。如何用 JAX-RS 做到这一点?

(我知道有StreamingOutput,但是需要手动序列化数据。)

【问题讨论】:

    标签: java json rest jax-rs chunked


    【解决方案1】:

    分块传输编码通常用于发送方开始传输数据时内容长度未知的情况。接收器可以在服务器仍在生成新块时处理每个块。 这意味着服务器一直在发送。我认为分块发送I'm still working|I'm still working|I'm still working| 没有多大意义,据我所知,分块传输编码由大多数应用程序服务器透明地处理。当响应大于一定大小时,它们会自动切换。

    您的用例的常见模式如下所示:

    客户端触发批量操作:

    POST /batch-jobs HTTP/1.1
    

    服务器创建一个描述作业状态的资源,并在 Location 标头中返回 URI:

    HTTP/1.1 202 Accepted
    Location: /batch-jobs/stats/4711
    

    客户端检查此资源并收到 200:

    GET /batch-jobs/stats/4711 HTTP/1.1
    

    此示例使用 JSON,但您也可以返回纯文本或添加缓存标头,告诉客户端他应该等待下一次轮询的时间。

    HTTP/1.1 200 OK
    Content-Type: application/json
    
    { "status" : "running", "nextAttempt" : "3000ms" }
    

    如果工作完成,服务器应该回答 303 和他创建的资源的 URI:

    HTTP/1.1 303 See other
    Location: /batch-jobs/4711
    

    【讨论】:

    • 感谢您的回答。通过发送分块响应,我想到了这样的事情:{“item_id”:“1000”,“status”:“OK”},{“item_id”:“1010”,“status”:“错误:出了点问题"}, ... 您的解决方案看起来 RESTful,但我可以看到一些缺点 - 它需要在服务器上存储临时数据(操作结果)。
    • 没有测试但是当你没有连续发送块时你可能会遇到问题。但是,正如我在答案中指出的那样:如果内容足够大,则应自动使用分块编码。 Here's an example 有和没有StreamingOutput
    • 我已经测试了使用 Firefox 插件 - RESTClient 接收缓慢生成的分块响应。收到结果时正在显示,但我不知道何时完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2015-01-19
    • 1970-01-01
    • 2012-08-23
    • 2017-11-13
    • 2019-02-17
    相关资源
    最近更新 更多