JavaScript Fetch API
JavaScript 教程
收录了这篇文章

一,Fetch API 介绍

Fetch API提供了一个 JavaScript 接口,用于访问和操纵HTTP的请求和响应等。提供了一个全局 fetch()方法来跨网络异步获取资源。

fetch()是 XMLHttpRequest 的升级版,用于在 JavaScript 脚本里面发出 HTTP 请求。

 

二,基本用法:

fetch('https://test.com/api/info')
 .then(response => response.json())
 .then(json => console.log(json))
 .catch(err => console.log('Request Failed', err)); 

 

try {
  let response = await fetch('https://test.com/api/info');
  return await response.json();
} catch (error) {
  console.log('Request Failed', error);
}

 

三,请求

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

fetch()的第一个参数是 URL,还可以接受第二个参数,作为配置对象,定制发出的 HTTP 请求。

fetch(url, optionObj)

上面命令的optionObj就是第二个参数。

 

HTTP 请求的方法、标头、数据体都在这个对象里面设置。下面是一些示例。

const response = await fetch(url, {
 method: 'POST',
 headers: {
  "Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
 },
 body: 'foo=bar&lorem=ipsum',
});

const json = await response.json();

 

var url = 'https://test.com/v1/auth/login';

var payload = JSON.stringify({
  account: 'admin'
  password: 'adminpwd'
});

var jsonHeaders = new Headers({
  'Content-Type': 'application/json'
});

try {
  var response = await fetch(url, {
    method: 'POST',
    body: payload,
    headers: jsonHeaders
  });

  var responseJson = await response.json();
  if (response.status == 200) {

  } else {

  }
} catch(e) {
  console.log(e);
}

上面示例中,配置对象用到了三个属性。

method:HTTP 请求的方法,POST、DELETE、PUT都在这个属性设置。

headers:一个对象,用来定制 HTTP 请求的标头。

body:POST 请求的数据体。

注意,有些标头不能通过headers属性设置,比如Content-Length、Cookie、Host等等。它们是由浏览器自动生成,无法修改。

 

三,Response 对象

fetch()请求成功以后,得到的是一个 Response 对象。它对应服务器的 HTTP 回应。

const response = await fetch(url);

 

前面说过,Response 包含的数据通过 Stream 接口异步读取,但是它还包含一些同步属性,对应 HTTP 回应的标头信息(Headers),可以立即读取。

async function fetchText() {
 let response = await fetch('/readme.txt');
 console.log(response.status); 
 console.log(response.statusText);
}

 

上面示例中,response.status和response.statusText就是 Response 的同步属性,可以立即读取。

 

标头信息属性有下面这些:

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

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

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

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

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

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

 cors:跨域请求。

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

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

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

6,Response.redirected属性返回一个布尔值,表示请求是否发生过跳转。

 

读取内容的方法

Response对象根据服务器返回的不同类型的数据,提供了不同的读取方法。

response.text():得到文本字符串。
response.json():得到 JSON 对象。
response.blob():得到二进制 Blob 对象。
response.formData():得到 FormData 表单对象。
response.arrayBuffer():得到二进制 ArrayBuffer 对象。

上面5个读取方法都是异步的,返回的都是 Promise 对象。必须等到异步操作结束,才能得到服务器返回的完整数据。

 

更多

文件上传的一个问题,当使用如下 headers 时,上传会失败,提示:“fetch Missing boundary in multipart/form-data”。

let headers = new Headers({ 'Content-Type': 'multipart/form-data' });

解决办法是,不要设置 headers,fetch 默认请求即可,正常上传文件。

 

参考:

https://www.ruanyifeng.com/blog/2020/12/fetch-tutorial.html

https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API

 

修改时间 2024-09-10

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Node.js 单元测试
WordPress 文章置顶循环
JavaScript 流程控制语句
JavaScript 中 0.1 加 0.2 不等于 0.3 的原因和解决方法
如何使主题支持 Woocommerce
WordPress 常用接口
Express 使用模板引擎 EJS
JavaScript DOM 查找元素