前端培训-中级阶段(28)- fetch请求(2019-12-5期)

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。

前言



fetch 用于获取资源(包括跨域请求),其实和 XMLHttpRequest 差不多。那么为什么 AJAX 的解决方案已经有了,我们还要搞出一个新的API?


其实这是符合规则的。不是说 XMLHttpRequest 不好。而是科技发展就是这样,过个几年就要来点颠覆性的更新。


XMLHttpRequest 后面都叫 XHR 吧。


fetch 特点



  1. 默认不带 Cookie,这是一大槽点,我才接触的时候就经常吐槽(但是现在已经改了)。


自从2017年8月25日后,默认的 credentials 政策变更为 same-originFirefox 也在 61.0b13 中改变默认值 使用 Fetch - mdn

  1. 请求不能中途终止(XHRabort()
浏览器已经开始为 AbortController AbortSignal 接口(也就是Abort API)添加实验性支持,允许像 Fetch 和 XHR 这样的操作在还未完成时被中止 Fetch API - mdn

  1. Promise,写起来的确是比回调舒服
  2. 上传进度、下载进度(当做流,然后处理也能模拟)

fetch 语法



fetch(input [, init]);


input 入参


  1. 字符串类型、一个可以访问的URL地址。


  1. Request 对象。在 sw 中 fetch 事件捕获到的就是 Request 对象。


init 入参


这是一个对象。

  1. method请求方式
  1. 字符串类型 getpostput


  1. headers请求头

a.Headers 对象


b.对象形式


bVbBkAr.webp.jpg


3.body消息体,支持的和 XHR 一样。get 需要自己拼接在URL上


  1. Blob、File 比如input选择的文件
  2. Buffer
  3. FormData 表单上传 content-type: multipart/form-data
  4. URLSearchParams content-type: application/x-www-form-urlencoded
  5. String


4.mode

  1. 字符串类型
  1. cors 跨域请求
  2. no-cors 正常的网络请求(默认)
  3. same-origin 只请求同域


5.credentialscookie携带的方式

  1. 字符串类型
  1. omit 不携带 cookie (早期默认值,后来改了)
  2. same-origin 同域请求携带 cookie (默认值)
  3. include 一直携带 cookie。不考虑同域跨域


6.cache缓存模式

  1. 字符串类型 defaultno-storereloadno-cacheforce-cacheonly-if-cached


7.redirect重定向处理方式


  1. 字符串类型
  1. follow 自动处理,跟随跳转(早期默认值,后来改了)
  2. manual 阻止、(默认值)
  3. error 禁止处理


8.referrer请求来源

  1. 字符串类型 url地址,不可跨域。可以是相对路径
  1. client 标识客户端自己处理。默认
  2. no-referrer 不传递


9.referrerPolicy


  1. 字符串类型 no-referrerno-referrer-when-downgradeoriginorigin-when-cross-originunsafe-url


10.integrity 校验


fetch 使用实战



get请求


fetch(`https://www.lilnong.top/cors/get?ref=SF`)
    .then(v=>v.json())
    .then(v=>console.log(v))


post请求


因为get的不涉及到 content-type 所以还相对的简单一些。下面我们来针对不同的 content-type 写一下


application/json


fetch(`https://www.lilnong.top/cors/post?ref=SF`,{
        method:'post',
        headers: {'content-type':'application/json'},
        body:JSON.stringify({bodyRef:'SF'})
    })
    .then(v=>v.json())
    .then(v=>console.log(v))


multipart/form-data


fm = new FormData();
fm.append('type','formdata')
fm.append('bodyRef','SF')
fetch(`https://www.lilnong.top/cors/post?ref=SF`,{
        method:'post',
        body:fm
    })
    .then(v=>v.json())
    .then(v=>console.log(v))


application/x-www-form-urlencoded


fetch(`https://www.lilnong.top/cors/post?ref=SF`,{
        method:'post',
        body:new URLSearchParams({type: 'URLSearchParams',bodyRef:'SF'})
    })
    .then(v=>v.json())
    .then(v=>console.log(v))


post 上传文件


上传文件只能使用multipart/form-data。所以我们就是用FormData 对象。有时候我们需要给文件添加 filename


append 方案


fm.append(name,value,filename) value里面放 Blob 对象或者File 都可以。这里可以传入 filename


File 方案


File 对象自带 filename, new File(fileBits, fileName, options) 可以把 Blob 初始化成 File 对象。


ajax 获取图片并渲染


fetch(`//cors-www.lilnong.top/static/img/wx-linong.jpg`)
    .then(v=>v.blob())
    .then(v=>console.log(v,URL.createObjectURL(v)))


fetch 下载进度条展示


文章地址


测试地址-fetch显示进度条并下载


bVbtb2M.webp.jpg

相关文章
|
3月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
109 2
|
4月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
2月前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
38 18
|
2月前
|
前端开发 JavaScript API
前端Get请求能在body上传参吗
【10月更文挑战第11天】 在浏览器环境中,GET请求的body参数会被忽略,这是因为浏览器中的XHR和fetch实现限制了这一行为。而在Node.js服务端环境中,GET请求可以在body中传递参数,因为服务端请求库没有这样的限制。实际上,GET请求不带body是HTTP标准的一部分,但在某些场景下,为了遵循RESTful规范,可以考虑通过服务端转发或BFF模式来实现复杂的参数传递。
|
2月前
|
存储 缓存 监控
|
2月前
|
移动开发 前端开发 HTML5
SharedWorker 优化前端轮询请求
【10月更文挑战第6天】
30 1
|
4月前
|
存储 前端开发 Serverless
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
20 0
|
5月前
|
存储 前端开发 安全
前端轮询问题之在setTimeout版轮询中,如何避免旧请求的响应继续触发定时
前端轮询问题之在setTimeout版轮询中,如何避免旧请求的响应继续触发定时
|
5月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
【7月更文挑战第15天】Python后端(Django/Flask)与前端通过AJAX或Fetch API实现异步交互,提升Web应用体验。Python提供强大的后端支持,AJAX用于不刷新页面的数据交换,Fetch API作为现代标准,基于Promise简化HTTP请求。结合两者,构建高效、流畅的交互系统,优化响应速度和用户体验,开启Web开发新篇章。
85 5
|
5月前
|
前端开发
前端轮询问题之在使用setInterval进行轮询时重复发送请求如何解决
前端轮询问题之在使用setInterval进行轮询时重复发送请求如何解决
166 0