fetch的各种api

1.结构:

fetch(url,{参数)})
    .then(...)
    .catch(...)

2.与async await一起使用

async function fetchMovies() {
  const response = await fetch('/movies');
  // 等待直到请求完成
  console.log(response);
}

3.请求 JSON 数据

fetch()请求成功以后,得到的是一个 Response 对象。而不是json对象,需要转换一下。

async function fetchMovies() {
  const response = await fetch('/movies');
  // 等待直到请求完成
  console.log(response.json());
}

response.json() 返回一个解析为 JSON 对象的 promise

response.text() 返回一个解析为文本内容的 promise

response.formData 返回一个解析为 FormData 对象的 promise

response.blob() 返回一个解析为 Blogpromise

4.返回数据的api

async function fetchText() {
  let response = await fetch('/readme.txt');
  console.log(response.status); //返回状态码
  console.log(response.statusText);//HTTP返回的状态信息
}

1.Response.ok

Response.ok属性返回一个布尔值,表示请求是否成功,true对应 HTTP 请求的状态码 200299false对应其他的状态码。

2.Response.status

Response.status属性返回一个数字,表示 HTTP 回应的状态码(例如200,表示成功请求)。

3.Response.statusText

Response.statusText属性返回一个字符串,表示 HTTP 回应的状态信息(例如请求成功以后,服务器返回"OK")。

4.Response.url

Response.url属性返回请求的 URL。如果 URL 存在跳转,该属性返回的是最终 URL

5.Response.type

Response.type属性返回请求的类型。可能的值如下:

basic:普通请求,即同源请求。

cors:跨域请求。

error:网络错误,主要用于 Service Worker

opaque:如果fetch()请求的type属性设为no-cors,就会返回这个值,详见请求部分。表示发出的是简单的跨域请求,类似 <form> 表单的那种跨域请求。

opaqueredirect:如果fetch()请求的redirect属性设为manual,就会返回这个值,详见请求部分。

5.判断请求是否成功

fetch()发出请求以后,有一个很重要的注意点:只有网络错误,或者无法连接时,fetch()才会报错,其他情况都不会报错,而是认为请求成功。

这就是说,即使服务器返回的状态码是 4xx 或 5xx,fetch()也不会报错(即 Promise 不会变为 rejected状态)。

只有通过Response.status属性,得到 HTTP 回应的真实状态码,才能判断请求是否成功。

async function fetchText() {
  let response = await fetch('/readme.txt');
  if (response.status >= 200 && response.status < 300) {
    return await response.text();
  } else {
    throw new Error(response.statusText);
  }
}

另一种方法是判断response.ok是否为true。

async function fetchText() {
  let response = await fetch('/readme.txt');
    if (response.ok) {
  // 请求成功
    } else {
  // 请求失败
    }
}

6.response.headers.get()

Response 对象还有一个Response.headers属性,这些方法中,最常用的是response.headers.get(),用于读取某个标头的值。

async function fetchText() {  
  let response =  await  fetch(url);  
  response.headers.get('Content-Type')
// application/json; charset=utf-8
}

Headers.keys()Headers.values()方法用来分别遍历标头的键名和键值。

// 键名
for(let key of myHeaders.keys()) {
  console.log(key);
}

// 键值
for(let value of myHeaders.values()) {
  console.log(value);
}

Headers.forEach()方法也可以遍历所有的键值和键名。

let response = await fetch(url);
  response.headers.forEach(
  (value, key) => console.log(key, ':', value)
);

7. fetch()的第二个参数:定制 HTTP 请求

1.提交 JSON 数据


const user =  { name:  'John', surname:  'Smith'  };
const response = await fetch('/article/fetch/post/user', {
  method: 'POST',
  headers: {
   'Content-Type': 'application/json;charset=utf-8'
  }, 
  body: JSON.stringify(user) 
});

2.提交表单

const form = document.querySelector('form');

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

3.fetch()配置对象的完整 API

 const response = fetch(url, {
  method: "GET",
  headers: {
    "Content-Type": "text/plain;charset=UTF-8"
  },
  body: undefined,
  referrer: "about:client",
  referrerPolicy: "no-referrer-when-downgrade",
  mode: "cors", 
  credentials: "same-origin",
  cache: "default",
  redirect: "follow",
  integrity: "",
  keepalive: false,
  signal: undefined
});

cache

cache属性指定如何处理缓存。可能的取值如下:

default:默认值,先在缓存里面寻找匹配的请求。

no-store.:直接请求远程服务器,并且不更新缓存。

reload:直接请求远程服务器,并且更新缓存。

no-cache:将服务器资源跟本地缓存进行比较,有新的版本才使用服务器资`源,否则使用缓存。

force-cache:缓存优先,只有不存在缓存的情况下,才请求远程服务器。

only-if-cached:只检查缓存,如果缓存里面不存在,将返回504错误。

mode

mode属性指定请求的模式。可能的取值如下:

cors:默认值,允许跨域请求。

same-origin:只允许同源请求。

no-cors:请求方法只限于 GET、POST 和 HEAD,并且只能使用有限的几个简单标头,不能添加跨域的复杂标头,相当于提交表单所能发出的请求。

credentials

credentials属性指定是否发送 Cookie。可能的取值如下:

same-origin:默认值,同源请求时发送 Cookie,跨域请求时不发送。

include:不管同源请求,还是跨域请求,一律发送 Cookie。

omit:一律不发送。

signal

signal属性指定一个 AbortSignal 实例,用于取消fetch()请求

keepalive

keepalive属性用于页面卸载时,告诉浏览器在后台保持连接,继续发送数据。

一个典型的场景就是,用户离开网页时,脚本向服务器提交一些用户行为的统计信息。这时,如果不用keepalive属性,数据可能无法发送,因为浏览器已经把页面卸载了。

window.onunload = function() {
  fetch('/analytics', {
    method: 'POST',
    body: "statistics",
    keepalive: true
  });
};

redirect

redirect属性指定 HTTP 跳转的处理方法。可能的取值如下:

follow:默认值,fetch()跟随 HTTP 跳转。

error:如果发生跳转,fetch()就报错。

manualfetch()不跟随 HTTP 跳转,但是response.url属性会指向新的 URLresponse.redirected属性会变为true,由开发者自己决定后续如何处理跳转。

referrerPolicy

referrerPolicy属性用于设定Referer标头的规则。可能的取值如下:

no-referrer-when-downgrade:默认值,总是发送Referer标头,除非从 HTTPS 页面请求 HTTP 资源时不发送。

no-referrer:不发送Referer标头。

origin:Referer标头只包含域名,不包含完整的路径。

origin-when-cross-origin:同源请求Referer标头包含完整的路径,跨域请求只包含域名。

same-origin:跨域请求不发送Referer,同源请求发送。

strict-originReferer标头只包含域名,HTTPS 页面请求 HTTP 资源时不发送Referer标头。

strict-origin-when-cross-origin:同源请求时Referer标头包含完整路径,跨域请求时只包含域名,HTTPS 页面请求 HTTP 资源时不发送该标头。

unsafe-url:不管什么情况,总是发送Referer标头。

8.取消fetch()请求

fetch()请求发送以后,如果中途想要取消,需要使用AbortController对象。

let controller = new AbortController();
let signal = controller.signal;

fetch(url, {
  signal: controller.signal
});

signal.addEventListener('abort',
  () => console.log('abort!')
);

controller.abort(); // 取消

console.log(signal.aborted); // true

上面示例中,首先新建 AbortController 实例,然后发送fetch()请求,配置对象的signal属性必须指定接收 AbortController 实例发送的信号controller.signal

controller.abort()方法用于发出取消信号。这时会触发abort事件,这个事件可以监听,也可以通过controller.signal.aborted属性判断取消信号是否已经发出。

下面是一个1秒后自动取消请求的例子。


let controller = new AbortController();
setTimeout(() => controller.abort(), 1000);

try {
  let response = await fetch('/long-operation', {
    signal: controller.signal
  });
} catch(err) {
  if (err.name == 'AbortError') {
    console.log('Aborted!');
  } else {
    throw err;
  }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值