Stream API - Request 请求对象

请求对象用于从服务器获取资源。 请求对象是使用 Resquest 接口提供的 Resquest() 构造函数创建的。 因此,当创建新的 Request 对象时,我们可以将 ReadableStream 传递给 Request 对象的主体,这种类型的请求称为流请求。 然后将此请求对象传递给 fetch() 函数以获取资源。

语法

const myobject = new Request(URL, {
   method: 'POST',
   body: Stream,
   headers: {'Content-Type'},
   duplex: 'half',
});

这里Request()构造函数包含以下参数 −

  • URL − 资源地址。

  • method − 它代表HTTP请求方法,如GET、POST等。

  • body − 包含 ReadableStream 对象。

  • headers − 包含适合正文的标头。

  • duplex − 设置为一半以形成双工流。

示例

在下面的程序中,我们创建一个流请求。 因此,首先我们借助 ReadableStream() 构造函数以及实现 ReadableStream 逻辑和其他操作的 start() 函数创建一个可读流。 然后我们使用 Request() 构造函数和选项创建一个请求对象:method 选项包含发送请求的 POST 请求,body 选项包含流,headers 选项包含适当的标头,并设置 duplex 选项 一半以使其成为双工流。 创建请求对象后,我们将对象传递到 fetch() 函数中以发出请求,该函数使用 then() 处理响应,并使用 catch() 函数处理错误(如果发生)。 在这里,您可以使用有效的 API/URL 来代替 https://exampleApi.com/,它以块的形式发送/接收数据。

<script>
   // 使用 ReadableStream 构造函数创建可读流()
   const readStream = new ReadableStream({
      start(controller) {
			// 这里实现你的 ReadableStream
			// 另外,在控制器的帮助下,您可以将数据排队并
			// 表示流结束
      },
   });
   
   // 使用 Request() 构造函数创建请求对象
   const request = new Request('https://exampleApi.com/', {
      // Set the method
      method: 'POST',
   
      // 将流传递到请求正文
      body: stream,
   
      // 设置合适的标题
      headers: {'Content-Type': 'application/octet-stream'},
      duplex: 'half' 
   });
   
   // 创建请求对象后传递该对象
   // fetch() 函数发出请求或执行操作
   fetch(request)
   .then(response => {
      // Handling the response
   })
   .catch(error => {
      // 处理发生的任何错误
   });
</script>

限制

流请求是一项新功能,因此它有一些限制,并且它们是 −

半双工 − 要执行流请求,我们必须将双工选项设置为一半。 如果您没有在流请求中设置此选项,那么您将收到错误。 该选项告诉请求体是一个双工流,其中双工流是同时接收数据(可写)和发送数据(可读)的流。

需要 CORS 并触发预检 − 我们知道,流请求在请求正文中包含流,但没有"Content-Length"标头。 因此,对于此类请求,需要 CORS,并且它们总是会触发预检。 此外,不允许使用 no-cors 流请求。

不适用于 HTTP/1.x − 如果连接是 HTTP/1.x,则根据 HTTP/1.x 规则,它将拒绝提取。 根据 HTTP/1.x 规则,请求和响应主体应该需要发送 Content-Length 标头。 这样对方就可以记录接收了多少数据,或者可以更改格式以使用分块编码。 分块编码很常见,但对于请求来说,这是非常罕见的。

服务器端不兼容 − 有些服务器不支持流请求。 因此,始终仅使用那些支持流请求的服务器,例如 NodeJS 等。

结论

这就是我们如何为流创建 Request 对象,或者我们可以说这就是我们如何使用 fetch() 函数创建流请求。 流式请求对于发送大文件、实时数据处理、媒体流、连续数据馈送等非常有用。在下一篇文章中,我们将了解 Stream API 中的响应主体。