了解有关Fetch API的全部信息,Fetch API是使用Promises作为构建块的异步网络请求的现代方法
Fetch API简介
自IE5于1998年发布以来,我们可以选择使用以下命令在浏览器中进行异步网络调用XMLHttpRequest(XHR)。
此后数年,GMail和其他丰富的应用程序大量使用了它,并使该方法如此流行以至于必须要有一个名称:AJAX。
直接使用XMLHttpRequest一直很痛苦,几乎总是被某些库抽象化,特别是jQuery围绕它构建了自己的帮助器函数:
jQuery.ajax()
jQuery.get()
jQuery.post()
等等。
它们对使它更易于访问产生了巨大的影响,尤其是在确保所有功能都可以在较旧的浏览器上正常运行方面。
这提取API,已经标准化为异步网络请求和使用的现代方法承诺作为构建块。
除了IE之外,Fetch在所有主要浏览器上都有很好的支持。
保鲜膜https://github.com/github/fetch被释放的GitHub允许我们使用fetch
在任何浏览器上。
使用提取
开始将Fetch用于GET请求非常简单:
fetch('/file.json')
并且您已经在使用它:fetch将发出HTTP请求以获取file.json
同一域上的资源。
如您所见,fetch
该功能在全球范围内可用window
范围。
现在,让它变得更有用,让我们实际看看文件的内容是什么:
fetch('./file.json')
.then(response => response.json())
.then(data => console.log(data))
呼唤fetch()
返回一个承诺。然后,我们可以通过向处理程序传递一个then()
承诺的方法。
该处理程序接收到的返回值fetch
答应回复目的。
在下一节中,我们将详细介绍该对象。
捕捉错误
自从fetch()
返回承诺,我们可以使用catch
许诺拦截请求执行过程中发生的任何错误的方法,以及在then
回调:
fetch('./file.json')
.then(response => {
//...
})
.catch(err => console.error(err))
捕获错误的另一种方法是在第一时间对其进行管理then
:
fetch('./file.json')
.then(response => {
if (!response.ok) { throw Error(response.statusText) }
return response
})
.then(response => {
//...
})
响应对象
由a返回的响应对象fetch()
呼叫包含有关请求和网络请求响应的所有信息。
元数据
标头
访问headers
财产response
对象使您能够查看请求返回的HTTP标头:
fetch('./file.json').then(response => {
console.log(response.headers.get('Content-Type'))
console.log(response.headers.get('Date'))
})
状态
此属性是代表HTTP响应状态的整数。
- 101、204、205或304为空身体状态
- 200到299(含)之间为OK状态(成功)
301、302、303、307或308是重定向
fetch('./file.json').then(response => console.log(response.status))
statusText
statusText
是表示响应状态消息的属性。如果请求成功,则状态为OK
。
fetch('./file.json').then(response => console.log(response.statusText))
网址
url
代表我们提取的属性的完整URL。
fetch('./file.json').then(response => console.log(response.url))
身体内容
响应具有一个正文,可以使用以下几种方法进行访问:
text()
以字符串形式返回主体json()
将身体返回为JSON格式解析的对象blob()
将身体返回为斑点目的formData()
将正文作为FormData对象返回arrayBuffer()
返回身体作为ArrayBuffer
目的
所有这些方法都返回一个承诺。例子:
fetch('./file.json')
.then(response => response.text())
.then(body => console.log(body))
fetch('./file.json')
.then(response => response.json())
.then(body => console.log(body))
;(async () => {
const response = await fetch('./file.json')
const data = await response.json()
console.log(data)
})()
请求对象
Request对象代表一个资源请求,通常使用new Request()
API。
例子:
const req = new Request('/api/todos')
Request对象提供了几个只读属性来检查资源请求的详细信息,包括
method
:请求的方法(GET,POST等)url
:请求的网址。headers
:请求的关联Headers对象referrer
:请求的引荐来源cache
:请求的缓存模式(例如,默认,重新加载,无缓存)。
并公开了几种方法,包括json()
,text()
和formData()
处理请求的主体。
完整的API可以在以下位置找到https://developer.mozilla.org/docs/Web/API/Request
请求标头
能够设置HTTP请求标头至关重要,并且fetch
使我们能够使用Headers对象执行此操作:
const headers = new Headers()
headers.append('Content-Type', 'application/json')
或者:
const headers = new Headers({
'Content-Type': 'application/json'
})
要将标头附加到请求,我们使用Request对象,并将其传递给fetch()
而不是传递网址。
代替:
fetch('./file.json')
我们的确是
const request = new Request('./file.json', {
headers: new Headers({
'Content-Type': 'application/json'
})
})
fetch(request)
Headers对象不仅限于设置值,我们还可以查询它:
headers.has('Content-Type')
headers.get('Content-Type')
我们可以删除先前设置的标头:
headers.delete('X-My-Custom-Header')
POST请求
提取还允许在您的请求中使用任何其他HTTP方法:POST,PUT,DELETE或OPTIONS。
在请求的method属性中指定方法,并在标头和请求正文中传递其他参数:
POST请求的示例:
const options = {
method: 'post',
headers: {
'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
body: 'name=Flavio&test=1'
}
fetch(url, options).catch(err => {
console.error(‘Request failed’, err)
})
如何取消获取请求
几年后fetch
引入后,打开后便无法中止请求。
现在,由于引入了AbortController
和AbortSignal
,用于通知的通用API中止大事记
您可以通过传递信号作为访存参数来集成此API:
const controller = new AbortController()
const signal = controller.signal
fetch(’./file.json’, { signal })
您可以设置一个超时,以在获取请求开始后5秒钟触发中止事件,以将其取消:
setTimeout(() => controller.abort(), 5 * 1000)
方便的是,如果提取操作已经返回,则调用abort()
不会导致任何错误。
当发生中止信号时,提取将使用以下命令拒绝承诺DOMException
命名AbortError
:
fetch('./file.json', { signal })
.then(response => response.text())
.then(text => console.log(text))
.catch(err => {
if (err.name === 'AbortError') {
console.error('Fetch aborted')
} else {
console.error('Another error', err)
}
})
寻找更多?
使用网络很难,对吗?您可能会发现AxiosJavaScript库可能会基于Fetch构建一些附加功能,更适合您的需求。一探究竟!
免费下载我的JavaScript初学者手册
更多浏览器教程:
- HTML5提供了一些有用的技巧
- 我如何使基于CMS的网站脱机工作
- 渐进式Web应用程序完整指南
- 提取API
- 推送API指南
- 频道消息传递API
- 服务人员教程
- 缓存API指南
- 通知API指南
- 深入IndexedDB
- Selectors API:querySelector和querySelectorAll
- 通过延迟和异步有效地加载JavaScript
- 文档对象模型(DOM)
- Web存储API:本地存储和会话存储
- 了解HTTP Cookies的工作原理
- 历史API
- WebP图像格式
- XMLHttpRequest(XHR)
- 深入的SVG教程
- 什么是数据网址
- 学习网络平台的路线图
- CORS,跨域资源共享
- 网络工作者
- requestAnimationFrame()指南
- 什么是Doctype
- 使用DevTools控制台和控制台API
- 语音合成API
- 如何在纯JavaScript中等待DOM ready事件
- 如何将类添加到DOM元素
- 如何遍历来自querySelectorAll的DOM元素
- 如何从DOM元素中删除类
- 如何检查DOM元素是否具有类
- 如何更改DOM节点值
- 如何将click事件添加到从querySelectorAll返回的DOM元素列表中
- WebRTC,实时Web API
- 如何在JavaScript中获取元素的滚动位置
- 如何替换DOM元素
- 如何只接受输入文件字段中的图像
- 为什么要使用浏览器的预览版?
- Blob对象
- 文件对象
- FileReader对象
- FileList对象
- ArrayBuffer
- ArrayBufferView
- URL对象
- 类型数组
- DataView对象
- BroadcastChannel API
- Streams API
- FormData对象
- 导航器对象
- 如何使用地理位置API
- 如何使用getUserMedia()
- 如何使用拖放API
- 如何在网页上滚动
- 在JavaScript中处理表单
- 键盘事件
- 鼠标事件
- 触摸事件
- 如何从DOM元素中删除所有子级
- 如何使用原始Javascript创建HTML属性
- 如何检查是否使用JavaScript选中了复选框?
- 如何使用JavaScript复制到剪贴板
- 如何使用JavaScript禁用按钮
- 如何在浏览器中使页面可编辑
- 如何使用URLSearchParams在JavaScript中获取查询字符串值
- 如何一次删除页面上的所有CSS
- 如何使用insertAdjacentHTML
- Safari,退出前警告
- 如何使用JavaScript将图像添加到DOM
- 如何重设表格
- 如何使用Google字体