创建具有多部分响应的批处理HTTP API

时间:2019-02-07 14:44:58

标签: javascript rest xmlhttprequest http-headers multipart

实际上,我已经创建了一个批处理HTTP API,该API接收到一个JSON数组,该数组具有对我们的后端服务器的许多不同请求。 Batch API只是将所有这些请求调用到负载均衡器,等待所有请求返回并向客户端返回新的JSON。

客户端会收到一个巨大的JSON数组响应,其索引与请求的位置相同,因此很容易知道针对哪个请求处理了什么响应。

此API的动机是解决5个浏览器的同时连接并提高性能,因为Batch API对服务器具有更直接的访问权限(在此之间,我们没有反向代理或SSL服务器)。

该服务运行良好,但是现在我有了一些新的要求,因为它得到了越来越多的使用。首先,该服务可以使用大量内存,因为它为每个请求都有一个缓冲区,只有在所有响应准备就绪时(我正在使用有序JSON数组),才会刷新该服务。而且,由于所有请求都需要花费一些时间,因此客户端将需要等待所有处理,然后再接收单个字节。

我正计划更改服务以在每个响应可用时返回它(并解决上述两个问题)。并希望与您分享并验证我的想法:

  1. 我将响应从JSON响应更改为多部分响应。
  2. 服务器将为每个部分包括响应的索引
  3. 服务器将在响应可用时刷新响应
  4. 客户端XHR将需要了解多部分内容类型的响应,并能够在每个部分可用后立即对其进行处理。

我将创建一个PoC来验证每个步骤,但此刻我想验证该想法并听到一些想法。我对解决方案有一些疑问:

  1. 从我的阅读中,我对内容类型的怀疑是正确的。多份/混合?多部分/摘要?
  2. 我可以使用接受请求标头来识别客户端是否能够处理新服务的实现吗?如果是这样,正确的接受标头是什么?我的计划是使用相同的端点,但非常接受标头。
  3. 我如何开发一个XHR客户端,该客户端能够在单个响应的许多部分可用时立即对其进行处理?我在网上发现了一些想法,但那时我并不完全有信心。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 我将响应从JSON响应更改为多部分   回应。
  2.   
  3. 服务器将为每个部分包括   响应
  4.   
  5. 服务器将在响应可用后刷新响应
  6.   
  7.   客户XHR将需要了解多部分内容类型的响应以及   能够尽快处理每个零件。
  8.   

XHR协议不会通过来自客户端的单个请求来支持此工作流程。由于XHR严重依赖HTTP协议进行通信,因此XHR遵循HTTP连接规则。第一个也是最重要的规则:HTTP连接始终由客户端启动。另一个规则:XHR返回整个内容主体,否则将失败。

对您的工作流程的影响是,客户必须分别请求多部分响应的每个部分。

  
      
  1. 根据我的阅读,我对这种内容类型感到怀疑,因为它适合   响应。多份/混合?多部分/摘要?
  2.   

您应该对此表示怀疑,因为规范中没有规定要这样做。 response-type属性限制为the empty string (default), "arraybuffer", "blob", "document", "json", and "text".,可以设置替代MIME类型标头,但这不会更改响应类型。鉴于这种情况,XHR规范非常清楚其将发送回什么内容。它是以上as documented here.

列出的类型之一
  
      
  1. 我可以使用接受吗   请求标头,以识别客户端是否能够处理新的   服务实施?如果是这样,正确的接受标头是什么   这个?我的计划是使用相同的端点,但非常接受标头。
  2.   

自定义HTTP标头旨在帮助我们告诉服务器客户端所具有的功能。这很容易做到。它不一定必须位于accept标头中(因为它也是MIME类型的已定义列表)。

  
      
  1. 如何   我可以开发一个XHR客户端,该客户端能够处理   可用后立即作出单一回应?我发现了一些想法   Web,但那时我并不完全有信心。
  2.   

XHR由客户端本地处理,并且由于各种安全原因不能被覆盖。因此,由于这个原因,这不太可能作为解决方案。

注意:通常可能会建议您使用Chromium的自定义版本,但您的限制不允许这样做。