body属性
Request
对象和Response
对象都有body
属性,表示请求的内容。body
属性可能是以下的数据类型。
- ArrayBuffer
- ArrayBufferView (Uint8Array等)
- Blob/File
- string
- URLSearchParams
- FormData
var form = new FormData(document.getElementById('login-form'));
fetch("/login", {
method: "POST",
body: form
})
上面代码中,Request
对象的body
属性为表单数据。
Request
对象和Response
对象都提供以下方法,用来读取body
。
- arrayBuffer()
- blob()
- json()
- text()
- formData()
注意,上面这些方法都只能使用一次,第二次使用就会报错,也就是说,body
属性只能读取一次。Request
对象和Response
对象都有bodyUsed
属性,返回一个布尔值,表示body
是否被读取过。
var res = new Response('one time use');
console.log(res.bodyUsed); // false
res.text().then(function(v) {
console.log(res.bodyUsed); // true
});
console.log(res.bodyUsed); // true
res.text().catch(function(e) {
console.log('Tried to read already consumed Response');
});
上面代码中,第二次通过text
方法读取Response
对象实例的body
时,就会报错。
这是因为body
属性是一个stream对象,数据只能单向传送一次。这样的设计是为了允许 JavaScript 处理视频、音频这样的大型文件。
如果希望多次使用body
属性,可以使用Response
对象和Request
对象的clone
方法。它必须在body
还没有读取前调用,返回一个新的body
,也就是说,需要使用几次body
,就要调用几次clone
方法。
addEventListener('fetch', function(evt) {
var sheep = new Response("Dolly");
console.log(sheep.bodyUsed); // false
var clone = sheep.clone();
console.log(clone.bodyUsed); // false
clone.text();
console.log(sheep.bodyUsed); // false
console.log(clone.bodyUsed); // true
evt.respondWith(cache.add(sheep.clone()).then(function(e) {
return sheep;
});
});