资讯专栏INFORMATION COLUMN

Fetch API

princekin / 1567人阅读

摘要:现在有很多优雅的包装,但是这远远不够。一个实例代表了一个的请求部分。一旦创建,它所有的属性都是只读的。处理基本的返回不是所有的接口都返回格式的数据,所以还要处理一些类型的返回结果。最后很好用,但是现在还不允许取消一个请求。

Fetch API

一个隐藏最深的秘密就是AJAX的实现底层的XMLHttpRequest,这个方法本来并不是造出来干这事的。现在有很多优雅的API包装XHR,但是这远远不够。于是有了fetch API。我们来看看这个API的基本用法。最新的浏览器都已经支持这个方法了。

XMLHttpRequest

XHR对于我来说太过复杂,用起来大概是这样的:

</>复制代码

  1. // 开始XHR这些
  2. if (window.XMLHttpRequest) { // Mozilla, Safari, ...
  3. request = new XMLHttpRequest();
  4. } else if (window.ActiveXObject) { // IE
  5. try {
  6. request = new ActiveXObject("Msxml2.XMLHTTP");
  7. }
  8. catch (e) {
  9. try {
  10. request = new ActiveXObject("Microsoft.XMLHTTP");
  11. }
  12. catch (e) {}
  13. }
  14. }
  15. // 发送请求.
  16. request.open("GET", "https://davidwalsh.name/ajax-endpoint", true);
  17. request.send(null);

当然我们的JavaScript框架可以让我们愿意去用XHR,但是你看到的只是一个简单的例子。

基本的Fetch用法

fetch方法可以在window作用域中找到。第一个参数是你要访问的URL:

</>复制代码

  1. fetch("https://davidwalsh.name/some/url", {
  2. method: "get"
  3. }).then(function(response) {
  4. }).catch(function(err) {
  5. // Error :(
  6. });

fetch会返回一个Promise作为结果:

</>复制代码

  1. // 简单的返回结果处理
  2. fetch("https://davidwalsh.name/some/url").then(function(response) {
  3. }).catch(function(err) {
  4. // Error :(
  5. });
  6. // 更高级的链式处理
  7. fetch("https://davidwalsh.name/some/url").then(function(response) {
  8. return //...
  9. }).then(function(returnedValue) {
  10. // ...
  11. }).catch(function(err) {
  12. // Error :(
  13. });
Request头

请求能不能灵活使用就在于是否能灵活的设置请求的头。可以使用new Headers():

</>复制代码

  1. // 创建一个空的Headers实例
  2. var headers = new Headers();
  3. // 添加内容
  4. headers.append("Content-Type", "text/plain");
  5. headers.append("X-My-Custom-Header", "CustomValue");
  6. // 检查Headers的值
  7. headers.has("Content-Type"); // true
  8. headers.get("Content-Type"); // "text/plain"
  9. headers.set("Content-Type", "application/json");
  10. // 删除一个Header
  11. headers.delete("X-My-Custom-Header");
  12. // 添加初始值
  13. var headers = new Headers({
  14. "Content-Type": "text/plain",
  15. "X-My-Custom-Header": "CustomValue"
  16. });

你可以使用append, has, get, setdelete方法来设置请求的头。要使用Request头,需要创建一个Request实例:

</>复制代码

  1. var request = new Request("https://davidwalsh.name/some-url", {
  2. headers: new Headers({
  3. "Content-Type": "text/plain"
  4. })
  5. });
  6. fetch(request).then(function() { /* handle response */ });

我们来看看ResponseRequest都可以做什么。

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看起来是这样的:

</>复制代码

  1. var request = new Request("https://davidwalsh.name/users.json", {
  2. method: "POST",
  3. mode: "cors",
  4. redirect: "follow",
  5. headers: new Headers({
  6. "Content-Type": "text/plain"
  7. })
  8. });
  9. // 用起来
  10. fetch(request).then(function() { /* handle response */ });

只有第一个参数,请求的URL,是必须的。一旦Request创建,它所有的属性都是只读的。需要注意的是Request有一个clone方法,这个方法在Worker API里使用fetch 的时候很有用。fetch的简化调用方法:

</>复制代码

  1. fetch("https://davidwalsh.name/users.json", {
  2. method: "POST",
  3. mode: "cors",
  4. redirect: "follow",
  5. headers: new Headers({
  6. "Content-Type": "text/plain"
  7. })
  8. }).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.

</>复制代码

  1. // 在service worker测试的时候
  2. // 使用new Response(BODY, OPTIONS)创建一个response
  3. var response = new Response(".....", {
  4. ok: false,
  5. status: 404,
  6. url: "/"
  7. });
  8. // The fetch的 `then`会获得一个response实例
  9. fetch("https://davidwalsh.name/")
  10. .then(function(responseObj) {
  11. console.log("status: ", responseObj.status);
  12. });

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。

</>复制代码

  1. fetch("https://davidwalsh.name/demo/arsenal.json").then(function(response) {
  2. // Convert to JSON
  3. return response.json();
  4. }).then(function(j) {
  5. // Yay, `j` is a JavaScript object
  6. console.log(j);
  7. });

当然也可以用JSON.parse(jsonString),但是json方法更加简单易用。

处理基本的Text/HTML返回

不是所有的接口都返回JSON格式的数据,所以还要处理一些Text/HTML类型的返回结果。

</>复制代码

  1. fetch("/next/page")
  2. .then(function(response) {
  3. return response.text();
  4. }).then(function(text) {
  5. //
  6. 处理Blob返回
  7. 如果你想要通过fetch加载一个blob的话,会有一点不同:

  8. </>复制代码

    1. fetch("https://davidwalsh.name/flowers.jpg")
    2. .then(function(response) {
    3. return response.blob();
    4. })
    5. .then(function(imageBlob) {
    6. document.querySelector("img").src = URL.createObjectURL(imageBlob);
    7. });
  9. POST Form数据
  10. 另一个经常会遇到的情况是使用AJAX提交表单数据。

  11. </>复制代码

    1. fetch("https://davidwalsh.name/submit", {
    2. method: "post",
    3. body: new FormData(document.getElementById("comment-form"))
    4. });
  12. 最后
  13. fetchAPI很好用,但是现在还不允许取消一个请求。无论如何,有了fetch之后,我们可以简单的发出AJAX请求了。更多关于fetch 的内容可以参考Github下他们的repo。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81213.html

相关文章

  • $.ajax vs axios vs fetch

    摘要:使用它可以让页面请求少量的数据,而不用刷新整个页面。这是一个比较粗糙的,不符合关注分离的设计原则,配置和使用都不是那么友好。它的一个优势异步操作,但的异步操作是基于事件的异步模型,没有那么友好。 Ajax 是什么? 答:Ajax是一种可以在浏览器和服务器之间使用异步数据传输(HTTP请求)的技术。使用它可以让页面请求少量的数据,而不用刷新整个页面。而传统的页面(不使用Ajax)要刷新...

    bitkylin 评论0 收藏0
  • js基础进阶--从ajax到fetch的理解

    摘要:使用它可以让页面请求少量的数据,而不用刷新整个页面。基于什么答它基于的是。的库答基于上面的原因,各种库引用而生,然而最有名的就是的中的。它的一个优势异步操作,但的异步操作是基于事件的异步模型,没有那么友好。 欢迎访问我的个人博客:http://www.xiaolongwu.cn 基本知识 1. Ajax是什么? 答:Ajax是一种可以在浏览器和服务器之间使用异步数据传输(HTTP请求)...

    SoapEye 评论0 收藏0
  • ES6 Fetch API HTTP请求实用指南

    摘要:例子张三删除用户为了删除用户,我们首先需要定位用户,然后我们定义方法类型。例子张三结论现在,你已基本了解如何使用的从服务器检索或操作资源,以及如何处理。您可以使用本文作为如何构建操作的请求的指南。 showImg(https://segmentfault.com/img/bVbjxqh?w=1000&h=562); 本次将介绍如何使用Fetch API(ES6 +)对REST API的...

    Sunxb 评论0 收藏0
  • fetch 如何请求数据

    摘要:四请求常见数据格式接下来将介绍如何使用请求本地文本数据,请求本地数据以及请求网络接口。请求网络接口获取中的数据,做法与获取本地的方法类似得到数据后,同样要经过处理 一 序言 在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好。今天我们介绍的Fetch提供了一个更好的替代方...

    MarvinZhang 评论0 收藏0
  • fetch 如何请求数据

    摘要:四请求常见数据格式接下来将介绍如何使用请求本地文本数据,请求本地数据以及请求网络接口。请求网络接口获取中的数据,做法与获取本地的方法类似得到数据后,同样要经过处理 一 序言 在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好。今天我们介绍的Fetch提供了一个更好的替代方...

    Betta 评论0 收藏0

发表评论

0条评论

princekin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<