Ajax 简明教程

Stream API - Request Object

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

Syntax

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

此处,Request() 构造函数包含以下参数:

  1. URL - 资源的地址。

  2. method - 它表示 HTTP 请求方式,例如 GET、POST 等。

  3. body - 包含 ReadableStream 对象。

  4. headers - 包含适合于主体的大小写。

  5. duplex −设为一半才能形成双工流。

Example

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

<script>
   // Create a readable stream using the ReadableStream constructor()
   const readStream = new ReadableStream({
      start(controller) {
         // Here implement your ReadableStream
         // Also with the help of controller, you can enqueue data and
         // signal the end of the stream
      },
   });

   // Create a request objecct using Request() constructor
   const request = new Request('https://exampleApi.com/', {
      // Set the method
      method: 'POST',

      // Passing the stream to the body of the request
      body: stream,

      // Setting suitable header
      headers: {'Content-Type': 'application/octet-stream'},
      duplex: 'half'
   });

   // After creating a request object pass the object
   // to fetch() function make a request or perform operations
   fetch(request)
   .then(response => {
      // Handling the response
   })
   .catch(error => {
      // Handling any errors if occur
   });
</script>

Restrictions

流式请求是一个新功能,所以它有一些限制 −

Half duplex −为了执行流式请求,我们必须将 duplex 选项设为一半。如果你在流式请求中没有设置此选项,那么你会收到一条错误信息。此选项说明该请求主体是一个双工流,其中双工流是一个同时接收数据(可写)和发送数据(可读)的流。

Required CORS and trigger a preflight −正如我们所知,流式请求在请求主体中包含一个流,但没有“Content-Length”头部。所以对于这种类型的请求,必须进行 CORS 并且它们总会触发一个预检。而且,不允许无 CORS 流式请求。

Does not work on HTTP/1.x −如果连接是 HTTP/1.x,那么它将根据 HTTP/1.x 规则拒绝取用。根据 HTTP/1.x 规则,请求和响应主体需要发送一个 Content-Length 头部。这样,另一方就可以记录收到的数据量,或更改格式以使用分块编码。分块编码很常见,但对于请求而言,它非常少见。

Server-side incompatibility −某些服务器不支持流式请求。所以始终只使用支持流式请求的那些服务器,例如 NodeJS 等。

Conclusion

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