摘要:现在有很多优雅的包装,但是这远远不够。一个实例代表了一个的请求部分。一旦创建,它所有的属性都是只读的。处理基本的返回不是所有的接口都返回格式的数据,所以还要处理一些类型的返回结果。最后很好用,但是现在还不允许取消一个请求。
Fetch API
一个隐藏最深的秘密就是AJAX的实现底层的XMLHttpRequest,这个方法本来并不是造出来干这事的。现在有很多优雅的API包装XHR,但是这远远不够。于是有了fetch API。我们来看看这个API的基本用法。最新的浏览器都已经支持这个方法了。
XMLHttpRequestXHR对于我来说太过复杂,用起来大概是这样的:
// 开始XHR这些 if (window.XMLHttpRequest) { // Mozilla, Safari, ... request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } // 发送请求. request.open("GET", "https://davidwalsh.name/ajax-endpoint", true); request.send(null);
当然我们的JavaScript框架可以让我们愿意去用XHR,但是你看到的只是一个简单的例子。
基本的Fetch用法fetch方法可以在window作用域中找到。第一个参数是你要访问的URL:
fetch("https://davidwalsh.name/some/url", { method: "get" }).then(function(response) { }).catch(function(err) { // Error :( });
fetch会返回一个Promise作为结果:
// 简单的返回结果处理 fetch("https://davidwalsh.name/some/url").then(function(response) { }).catch(function(err) { // Error :( }); // 更高级的链式处理 fetch("https://davidwalsh.name/some/url").then(function(response) { return //... }).then(function(returnedValue) { // ... }).catch(function(err) { // Error :( });Request头
请求能不能灵活使用就在于是否能灵活的设置请求的头。可以使用new Headers():
// 创建一个空的Headers实例 var headers = new Headers(); // 添加内容 headers.append("Content-Type", "text/plain"); headers.append("X-My-Custom-Header", "CustomValue"); // 检查Headers的值 headers.has("Content-Type"); // true headers.get("Content-Type"); // "text/plain" headers.set("Content-Type", "application/json"); // 删除一个Header headers.delete("X-My-Custom-Header"); // 添加初始值 var headers = new Headers({ "Content-Type": "text/plain", "X-My-Custom-Header": "CustomValue" });
你可以使用append, has, get, set和delete方法来设置请求的头。要使用Request头,需要创建一个Request实例:
var request = new Request("https://davidwalsh.name/some-url", { headers: new Headers({ "Content-Type": "text/plain" }) }); fetch(request).then(function() { /* handle response */ });
我们来看看Response和Request都可以做什么。
Request一个Request实例代表了一个fetch的请求部分。给fetch 传入一个request你可以发出高级的、定制的请求:
method - GET, POST, PUT, DELETE, HEAD
url - URL of the request
headers - associated Headers object
referrer - referrer of the request
mode - cors, no-cors, same-origin
credentials - should cookies go with the request? omit, same-origin
redirect - follow, error, manual
integrity - subresource integrity value
cache - cache mode (default, reload, no-cache)
一个简单的Request看起来是这样的:
var request = new Request("https://davidwalsh.name/users.json", { method: "POST", mode: "cors", redirect: "follow", headers: new Headers({ "Content-Type": "text/plain" }) }); // 用起来 fetch(request).then(function() { /* handle response */ });
只有第一个参数,请求的URL,是必须的。一旦Request创建,它所有的属性都是只读的。需要注意的是Request有一个clone方法,这个方法在Worker API里使用fetch 的时候很有用。fetch的简化调用方法:
fetch("https://davidwalsh.name/users.json", { method: "POST", mode: "cors", redirect: "follow", headers: new Headers({ "Content-Type": "text/plain" }) }).then(function() { /* handle response */ });Respone
使用fetch的then方法会获得一个Response实例。你也可以自己创建一个。
type - basic, cors
url
useFinalURL - Boolean for if url is the final URL
status - status code (ex: 200, 404, etc.)
ok - Boolean for successful response (status in the range 200-299)
statusText - status code (ex: OK)
headers - Headers object associated with the response.
// 在service worker测试的时候 // 使用new Response(BODY, OPTIONS)创建一个response var response = new Response(".....", { ok: false, status: 404, url: "/" }); // The fetch的 `then`会获得一个response实例 fetch("https://davidwalsh.name/") .then(function(responseObj) { console.log("status: ", responseObj.status); });
Response实例也提供了如下的方法:
clone() - Creates a clone of a Response object.
error() - Returns a new Response object associated with a network error.
redirect() - Creates a new response with a different URL.
arrayBuffer() - Returns a promise that resolves with an ArrayBuffer.
blob() - Returns a promise that resolves with a Blob.
formData() - Returns a promise that resolves with a FormData object.
json() - Returns a promise that resolves with a JSON object.
text() - Returns a promise that resolves with a USVString (text).
处理JSON假设你有一个请求会返回JSON。
fetch("https://davidwalsh.name/demo/arsenal.json").then(function(response) { // Convert to JSON return response.json(); }).then(function(j) { // Yay, `j` is a JavaScript object console.log(j); });
当然也可以用JSON.parse(jsonString),但是json方法更加简单易用。
处理基本的Text/HTML返回不是所有的接口都返回JSON格式的数据,所以还要处理一些Text/HTML类型的返回结果。
fetch("/next/page") .then(function(response) { return response.text(); }).then(function(text) { // 处理Blob返回如果你想要通过fetch加载一个blob的话,会有一点不同:
fetch("https://davidwalsh.name/flowers.jpg") .then(function(response) { return response.blob(); }) .then(function(imageBlob) { document.querySelector("img").src = URL.createObjectURL(imageBlob); });POST Form数据另一个经常会遇到的情况是使用AJAX提交表单数据。
fetch("https://davidwalsh.name/submit", { method: "post", body: new FormData(document.getElementById("comment-form")) });最后fetchAPI很好用,但是现在还不允许取消一个请求。无论如何,有了fetch之后,我们可以简单的发出AJAX请求了。更多关于fetch 的内容可以参考Github下他们的repo。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/81213.html
摘要:使用它可以让页面请求少量的数据,而不用刷新整个页面。这是一个比较粗糙的,不符合关注分离的设计原则,配置和使用都不是那么友好。它的一个优势异步操作,但的异步操作是基于事件的异步模型,没有那么友好。 Ajax 是什么? 答:Ajax是一种可以在浏览器和服务器之间使用异步数据传输(HTTP请求)的技术。使用它可以让页面请求少量的数据,而不用刷新整个页面。而传统的页面(不使用Ajax)要刷新...
摘要:使用它可以让页面请求少量的数据,而不用刷新整个页面。基于什么答它基于的是。的库答基于上面的原因,各种库引用而生,然而最有名的就是的中的。它的一个优势异步操作,但的异步操作是基于事件的异步模型,没有那么友好。 欢迎访问我的个人博客:http://www.xiaolongwu.cn 基本知识 1. Ajax是什么? 答:Ajax是一种可以在浏览器和服务器之间使用异步数据传输(HTTP请求)...
摘要:例子张三删除用户为了删除用户,我们首先需要定位用户,然后我们定义方法类型。例子张三结论现在,你已基本了解如何使用的从服务器检索或操作资源,以及如何处理。您可以使用本文作为如何构建操作的请求的指南。 showImg(https://segmentfault.com/img/bVbjxqh?w=1000&h=562); 本次将介绍如何使用Fetch API(ES6 +)对REST API的...
摘要:四请求常见数据格式接下来将介绍如何使用请求本地文本数据,请求本地数据以及请求网络接口。请求网络接口获取中的数据,做法与获取本地的方法类似得到数据后,同样要经过处理 一 序言 在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好。今天我们介绍的Fetch提供了一个更好的替代方...
摘要:四请求常见数据格式接下来将介绍如何使用请求本地文本数据,请求本地数据以及请求网络接口。请求网络接口获取中的数据,做法与获取本地的方法类似得到数据后,同样要经过处理 一 序言 在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好。今天我们介绍的Fetch提供了一个更好的替代方...
阅读 2080·2021-09-29 09:35
阅读 682·2021-09-08 09:36
阅读 3391·2021-09-03 10:30
阅读 2110·2019-08-30 14:21
阅读 2907·2019-08-30 11:18
阅读 3309·2019-08-29 17:31
阅读 3138·2019-08-29 17:29
阅读 1303·2019-08-29 17:13