在项目中使用fetch操作文件流,因为没有用到axios,而且fetch的使用方式和axios还有一定的区别,所以写一篇博文,具体细致的描述下fetch的基本使用。
Fetch API提供了一个 JavaScript 接口用于访问和操作HTTP管道的零件,如请求和响应
。它还提供了一种全局fetch()方法,可以提供一种简单,合理的方式在网络上异步获取资源
。
fetch(url).then(function(response) {
return response.json();
}).then(function(data) {
console.log(data);
}).catch(function(e) {
console.log("Oops, error");
});
fetch(url?key1=val1&key2=val2&...).then((response) => response.json()).then((json) => {
//处理返回值
}).catch((error) => {
//异常处理
})
fetch(url', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
firstParam: 'yourValue',
secondParam: 'secondValue',
})
})
let formData = new FormData();
formData.append("key",表单内容);
fetch(url , {
method: 'POST',
headers: {},
body: formData,
).then((response) => {
if (response.ok) {
return response.json();
}
).then((json) => {
alert(JSON.stringify(json));
).catch((error) => {
console.error(error);
);
// 点击音乐列表请求音乐数据
requestMusicData(item,index){
//请求并且传递音乐名称
fetch('/music/file?name='+item.innerText,{
method: 'get',
responseType: 'blob'
}).then(res => {
return res.blob();
}).then(blob => {
let bl = new Blob([blob], {type: "audio/m4a"});
let fileName = Date.parse(new Date())+".m4a";
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
window.URL.revokeObjectURL(link.href);
})
}
requestMusicData(item,index){
//请求并且传递音乐名称
fetch('/music/file?name='+item.innerText,{
method: 'get',
responseType: 'arraybuffer'
}).then(res => {
return res.arrayBuffer();
}).then(arraybuffer => {
//...
})
}
Fetch API的Body mixin表示响应/请求的主体,允许你声明一下它的内容类型以及它应该如何处理。
Body是通过Request和Response来实现的。这为这些对象提供了一个关联的主体(一个流),一个使用的标志(最初未设置)和一个MIME类型(最初是空字节序列)。
Body.body(只读)
ReadableStream
。Body.bodyUsed(只读)
Boolean
表明是否已经阅读主体的内容。基本使用案例分析:
fetch(url)
.then(function(response) {
return response.blob(); // 可以根据使用场景更换为 response.arrayBuffer()、response.text()、response.formData()、response.json()、response.text()
})
.then(function(youType) {
// ...
});
promise
,可以解决一个ArrayBuffer
promise
,使用一个Blob
解决Promise
,它使用一个FormData
对象来解决正文文本为JSON
的结果。这可以是任何可以由JSON表示的东西:对象、数组、字符串、数字
等等promise
,使用一个USVString
解决在Body接口中,该Request()构造函数用来创建一个新的Request对象
简单案例体验:
var myImage = document.querySelector('img');
var myHeaders = new Headers();
myHeaders.append('Content-Type', 'image/jpeg');
var myInit = { method: 'GET', headers: myHeaders, mode: 'cors', cache: 'default' };
var myRequest = new Request('flowers.jpg',myInit); // 参数和fetch(attr)的attr参数保持一致
fetch(myRequest).then(function(response) {
...
});
var myHeaders = new Headers();
myHeaders.append('Content-Type', 'image/jpeg');
var myInit = { method: 'GET', headers: myHeaders, mode: 'cors', cache: 'default' };
var myRequest = new Request('flowers.jpg',myInit);
myContentType = myRequest.headers.get('Content-Type'); // returns 'image/jpeg'
确定跨域请求
是否导致有效的响应,并且其响应的哪些属性是可读的,默认允许跨域cros
。omit
:从不发送cookie。same-origin
:如果URL与调用脚本位于相同的源,则发送用户凭证(cookie,基本http认证等)。include
:始终发送用户凭据(cookie,基本http认证等),甚至用于跨源调用。client
,no-referrer
,或 URL
。注意:如果 referrer 只读属性的值是 no-referrer,则它将返回一个空字符串。 response.arrayBuffer().then(function(buffer) {
// do something with buffer
});
response.blob().then(function(myBlob) {
// do something with myBlob
});
response.formData().then(function(formdata) {
// do something with your formdata
});
var myRequest = new Request('flowers.jpg');
var newRequest = myRequest.clone(); // a copy of the request is now stored in newRequest
Fetch API 的 Response 接口用于表示对请求的响应。
您可以使用 Response.Response() 构造函数创建一个新的 Response 对象,但您更可能遇到由于另一个 API 操作(例如一个 service worker:Fetchevent.respondWith或简单的 GlobalFetch.fetch() 操作)而返回的 Response 对象
响应相关的属性参数和方法,前面也有部分罗列,比较简单,所以就不做搬运工了,附上目录和官方文档的地址:
Fetch API 的 Headers 接口允许对 HTTP 请求和响应头执行各种操作。这些操作包括检索、设置、添加和删除。一个 Headers 对象有一个关联的标题列表,它最初是空的,由零个或多个名称和值对组成。您可以使用像 append() 这样的方法添加到此处(请参阅示例)。在此 Headers 接口的所有方法中,标头名称均由不区分大小写的字节序列进行匹配。
出于安全原因,某些标头只能由用户代理控制。这些标题包括禁止的标头名称和禁止的响应标头名称。
标头对象还有一个关联的保护,这需要 immutable,request,request-no-cors,response,或 none 的值。这会影响 set(),delete() 和 append() 方法是否会产生变异的头。
您可以通过 Request.headers 和 Response.headers 属性检索 Headers 对象,并使用 Headers.Headers() 构造函数创建一个新 Headers 对象。
一个 Headers 对象的实现可以直接用在一个 for…of 结构中,而不是 entries():for (var p of myHeaders),相当于 for (var p of myHeaders.entries())。
https://www.w3cschool.cn/fetch_api/fetch_api-w7mt2jzc.html