body属性

Request对象和Response对象都有body属性,表示请求的内容。body属性可能是以下的数据类型。

  • ArrayBuffer
  • ArrayBufferView (Uint8Array等)
  • Blob/File
  • string
  • URLSearchParams
  • FormData
  1. var form = new FormData(document.getElementById('login-form'));
  2. fetch("/login", {
  3. method: "POST",
  4. body: form
  5. })

上面代码中,Request对象的body属性为表单数据。

Request对象和Response对象都提供以下方法,用来读取body

  • arrayBuffer()
  • blob()
  • json()
  • text()
  • formData()

注意,上面这些方法都只能使用一次,第二次使用就会报错,也就是说,body属性只能读取一次。Request对象和Response对象都有bodyUsed属性,返回一个布尔值,表示body是否被读取过。

  1. var res = new Response('one time use');
  2. console.log(res.bodyUsed); // false
  3. res.text().then(function(v) {
  4. console.log(res.bodyUsed); // true
  5. });
  6. console.log(res.bodyUsed); // true
  7. res.text().catch(function(e) {
  8. console.log('Tried to read already consumed Response');
  9. });

上面代码中,第二次通过text方法读取Response对象实例的body时,就会报错。

这是因为body属性是一个stream对象,数据只能单向传送一次。这样的设计是为了允许 JavaScript 处理视频、音频这样的大型文件。

如果希望多次使用body属性,可以使用Response对象和Request对象的clone方法。它必须在body还没有读取前调用,返回一个新的body,也就是说,需要使用几次body,就要调用几次clone方法。

  1. addEventListener('fetch', function(evt) {
  2. var sheep = new Response("Dolly");
  3. console.log(sheep.bodyUsed); // false
  4. var clone = sheep.clone();
  5. console.log(clone.bodyUsed); // false
  6. clone.text();
  7. console.log(sheep.bodyUsed); // false
  8. console.log(clone.bodyUsed); // true
  9. evt.respondWith(cache.add(sheep.clone()).then(function(e) {
  10. return sheep;
  11. });
  12. });