关于h5中的fetch方法解读(小结)


Posted in HTML / CSS onNovember 15, 2017

Fetch概念

fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,主要目的仅仅只是为了结合ServiceWorkers,来达到以下优化:

  1. 优化离线体验
  2. 保持可扩展性

当然如果ServiceWorkers和浏览器端的数据库IndexedDB配合,那么恭喜你,每一个浏览器都可以成为一个代理服务器一样的存在。(然而我并不认为这样是好事,这样会使得前端越来越重,走以前c/s架构的老路)

1. 前言

既然是h5的新方法,肯定就有一些比较older的浏览器不支持了,对于那些不支持此方法的

浏览器就需要额外的添加一个polyfill:

[链接]: https://github.com/fis-components/whatwg-fetch

2. 用法

ferch(抓取) :

HTML:

fetch('/users.html') //这里返回的是一个Promise对象,不支持的浏览器需要相应的ployfill或通过babel等转码器转码后在执行
    .then(function(response) {
    return response.text()})
    .then(function(body) {
    document.body.innerHTML = body
})

JSON : 

fetch('/users.json')
    .then(function(response) {
    return response.json()})
    .then(function(json) {
    console.log('parsed json', json)})
    .catch(function(ex) {
    console.log('parsing failed', ex)
})

Response metadata :

fetch('/users.json').then(function(response) {
  console.log(response.headers.get('Content-Type'))
  console.log(response.headers.get('Date'))
  console.log(response.status)
  console.log(response.statusText)
})

Post form:

var form = document.querySelector('form')

fetch('/users', {
  method: 'POST',
  body: new FormData(form)
})

Post JSON:

fetch('/users', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({  //这里是post请求的请求体
    name: 'Hubot',
    login: 'hubot',
  })
})

File upload:

var input = document.querySelector('input[type="file"]')

var data = new FormData()
data.append('file', input.files[0]) //这里获取选择的文件内容
data.append('user', 'hubot')

fetch('/avatars', {
  method: 'POST',
  body: data
})

3. 注意事项

(1)和ajax的不同点:

1. fatch方法抓取数据时不会抛出错误即使是404或500错误,除非是网络错误或者请求过程中被打断.但当然有解决方法啦,下面是demonstration:

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) { //判断响应的状态码是否正常
    return response //正常返回原响应对象
  } else {
    var error = new Error(response.statusText) //不正常则抛出一个响应错误状态信息
    error.response = response
    throw error
  }
}

function parseJSON(response) {
  return response.json()
}

fetch('/users')
  .then(checkStatus)
  .then(parseJSON)
  .then(function(data) {
    console.log('request succeeded with JSON response', data)
  }).catch(function(error) {
    console.log('request failed', error)
  })

2.一个很关键的问题,fetch方法不会发送cookie,这对于需要保持客户端和服务器端常连接就很致命了,因为服务器端需要通过cookie来识别某一个session来达到保持会话状态.要想发送cookie需要修改一下信息:

fetch('/users', {
  credentials: 'same-origin'  //同域下发送cookie
})
fetch('https://segmentfault.com', {
  credentials: 'include'     //跨域下发送cookie
})

下图是跨域访问segment的结果

关于h5中的fetch方法解读(小结)

Additional

如果不出意外的话,请求的url和响应的url是相同的,但是如果像redirect这种操作的话response.url可能就会不一样.在XHR时,redirect后的response.url可能就不太准确了,需要设置下:response.headers['X-Request-URL'] = request.url适用于( Firefox < 32, Chrome < 37, Safari, or IE.)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
学做Bootstrap的第一个页面
May 15 HTML / CSS
css3学习心得分享
Aug 19 HTML / CSS
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
Feb 10 HTML / CSS
使用css3和jquery实现可伸缩搜索框
Feb 12 HTML / CSS
CSS3 mask 遮罩的具体使用方法
Nov 03 HTML / CSS
HTML5的结构和语义(5):内嵌媒体
Oct 17 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
Jul 19 HTML / CSS
html5的websockets全双工通信详解学习示例
Feb 26 HTML / CSS
html5各种页面切换效果和模态对话框用法总结
Dec 15 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
Apr 24 HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
Jan 27 HTML / CSS
h5使用canvas画布实现手势解锁
Jan 04 HTML / CSS
canvas 实现 github404动态效果的示例代码
Nov 15 #HTML / CSS
手机端用rem+scss做适配的详解
Nov 15 #HTML / CSS
基于HTML5的WebGL经典3D虚拟机房漫游动画
Nov 15 #HTML / CSS
Adobe Html5 Extension开发初体验图文教程
Nov 14 #HTML / CSS
html5中canvas图表实现柱状图的示例
Nov 13 #HTML / CSS
有关HTML5页面在iPhoneX适配问题
Nov 13 #HTML / CSS
浅谈HTML5 FileReader分布读取文件以及其方法简介
Nov 09 #HTML / CSS
You might like
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
js 提交和设置表单的值
2008/12/19 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
github配置使用指南
2014/11/18 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python实现按任意键继续执行程序
2016/12/30 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
python datetime处理时间小结
2020/04/16 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
北承题目(C++)
2012/05/16 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
小学毕业感言300字
2014/02/19 职场文书
小学毕业演讲稿
2014/04/25 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
实习生矿工检讨书
2014/10/13 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
2015年度企业工作总结
2015/05/21 职场文书
世界名著读书笔记
2015/06/25 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android