JavaScript

JavaScript 知识量:26 - 101 - 483

23.5 Fetch API><

基本用法- 23.5.1 -

Fetch API是一种现代的JavaScript API,用于进行网络请求和处理响应数据。它提供了一种更简单和更灵活的方式来执行网络请求,取代了传统的XMLHttpRequest(XHR)接口。Fetch API基于Promise对象,可以用于替代传统的XMLHttpRequest接口,并且具有更好的性能和更丰富的功能。

Fetch API的基本用法如下:

fetch(url)  
  .then(response => {  
    if (!response.ok) {  
      throw new Error('Network response was not ok');  
    }  
    return response.json();  
  })  
  .then(data => {  
    console.log(data);  
  })  
  .catch(error => {  
    console.error(error);  
  });

在这个例子中,fetch(url)发起一个HTTP请求到指定的URL,并返回一个Promise对象。当服务器响应请求时,该Promise对象将被解析为Response对象,然后可以通过调用response.json()方法将其解析为JSON格式的数据。最后,可以在控制台中打印出获取到的数据。

如果服务器响应不是2xx范围,则response.ok将返回false,可以抛出一个错误来处理这种情况。如果需要处理其他类型的响应,可以使用response.status和response.statusText等属性来获取更多信息。

除了处理JSON格式的数据,Fetch API还支持处理其他类型的数据,如文本、Blob等。此外,Fetch API还支持设置请求头、发送POST请求等操作,以及在服务端进行跨域请求时的CORS处理等功能。

常见Fetch请求模式- 23.5.2 -

Fetch API 是一种现代的网络请求方式,它提供了强大的功能和更好的性能。与 XMLHttpRequest 相比,Fetch API 使用 Promise 对象,使得异步操作更加简洁和易于管理。

在使用 Fetch API 时,常见的请求模式包括:

1. GET 请求:用于从服务器获取数据。在 Fetch API 中,可以通过传递一个 URL 字符串给 fetch() 方法来发送 GET 请求。例如:

fetch('https://api.example.com/data')  
  .then(response => response.json())  
  .then(data => console.log(data));

2. POST 请求:用于向服务器发送数据。在 Fetch API 中,可以通过传递一个 init 对象给 fetch() 方法来发送 POST 请求。init 对象中可以包含一个 body 属性,用于指定请求体中的数据。例如:

fetch('https://api.example.com/data', {  
  method: 'POST',  
  headers: {  
    'Content-Type': 'application/json'  
  },  
  body: JSON.stringify({ name: 'John', age: 30 })  
})  
  .then(response => response.json())  
  .then(data => console.log(data));

3. PUT 请求:用于更新服务器上的数据。PUT 请求与 POST 请求类似,可以通过传递一个 init 对象给 fetch() 方法来发送 PUT 请求。例如:

fetch('https://api.example.com/data/1', {  
  method: 'PUT',  
  headers: {  
    'Content-Type': 'application/json'  
  },  
  body: JSON.stringify({ name: 'John', age: 35 })  
})  
  .then(response => response.json())  
  .then(data => console.log(data));

4. DELETE 请求:用于从服务器删除数据。可以通过传递一个 URL 字符串给 fetch() 方法来发送 DELETE 请求。例如:

fetch('https://api.example.com/data/1', { method: 'DELETE' })  
  .then(response => response.json())  
  .then(data => console.log(data));

Headers对象- 23.5.3 -

JavaScript中的Headers对象是Fetch API的一部分,用于设置或获取HTTP请求的头部信息。它类似于一个键值对集合,其中的键是头部字段的名称,值是对应的头部字段的值。

以下是如何使用Headers对象的一些示例:

// 创建一个新的Headers对象  
let myHeaders = new Headers();  
  
// 添加一个新的头部字段和值  
myHeaders.append('Content-Type', 'image/jpeg');  
  
// 另一种添加头部字段和值的方法  
myHeaders.set('Content-Length', '12345');  
  
// 获取特定的头部字段的值  
let contentType = myHeaders.get('Content-Type');  
  
// 检查特定的头部字段是否存在  
if (myHeaders.has('Content-Length')) {  
  // do something  
}

也可以在创建新的Headers对象时直接传入一个包含键值对的对象,如下所示:

let myHeaders = new Headers({  
  'Content-Type': 'image/jpeg',  
  'Content-Length': '12345'  
});

注意:不是所有的HTTP请求都可以包含所有的头部字段。某些字段(如Content-Length)可能只适用于某些类型的请求。如果尝试设置不适用的头部字段,浏览器可能会忽略这个设置,或者抛出一个错误。因此,在使用Headers对象时,需要确保正在设置的头部字段和值是合适的。

Request对象- 23.5.4 -

Request对象用于表示一个HTTP请求。Request对象包含关于请求的各种信息,包括请求的URL、方法(GET、POST等)、头部信息、以及请求体。

下面是一个使用Request对象的简单示例:

let myRequest = new Request('https://api.example.com/data', {  
  method: 'GET',  
  headers: new Headers(),  
  mode: 'cors',  
  cache: 'default',  
  credentials: 'include'  
});

在这个例子中,创建了一个新的Request对象,请求URL为https://api.example.com/data,使用GET方法,设置了CORS模式,并包含了credentials(例如cookies)。

也可以使用fetch()函数,它返回一个Promise,当服务器响应请求时,这个Promise将会解析为Response对象。例如:

fetch(myRequest)  
  .then(response => response.json())  
  .then(data => console.log(data))  
  .catch(error => console.log('Error:', error));

在这个例子中,使用fetch()函数发送请求,然后使用.then()方法处理返回的Response对象。首先,将响应解析为JSON,然后将数据打印到控制台。如果在处理过程中出现错误,将在控制台中打印错误信息。

Response对象- 23.5.5 -

Response对象用于表示服务器对请求的响应。Response对象包含响应的内容,包括文本、JSON、Blob等,还包含响应的头部信息。

以下是一些使用Response对象的示例:

1. 获取响应内容

可以使用Response对象的text()、json()、blob()等方法获取响应的内容。例如:

fetch('https://api.example.com/data')  
  .then(response => response.json())  
  .then(data => console.log(data))  
  .catch(error => console.log('Error:', error));

在这个例子中,使用fetch()函数发送请求,然后使用Response对象的json()方法将响应解析为JSON对象,并将数据打印到控制台。

2. 获取响应状态码

可以使用Response对象的status属性获取响应的状态码。例如:

fetch('https://api.example.com/data')  
  .then(response => {  
    if (response.status === 200) {  
      return response.json();  
    } else {  
      throw new Error('Error: ' + response.status);  
    }  
  })  
  .then(data => console.log(data))  
  .catch(error => console.log('Error:', error));

在这个例子中,使用Response对象的status属性检查响应的状态码是否为200,如果是,则将响应解析为JSON对象,否则抛出一个错误。

3. 获取响应头部信息

可以使用Response对象的headers属性获取响应的头部信息。例如:

fetch('https://api.example.com/data')  
  .then(response => {  
    let contentType = response.headers.get('content-type');  
    if (contentType && contentType.includes('application/json')) {  
      return response.json();  
    } else {  
      throw new Error('Error: Invalid content-type');  
    }  
  })  
  .then(data => console.log(data))  
  .catch(error => console.log('Error:', error));

在这个例子中,使用Response对象的headers属性获取响应的content-type头部信息,并检查它是否包含application/json。如果是,则将响应解析为JSON对象,否则抛出一个错误。

Request和Response的Body混入- 23.5.6 -

在Fetch API中,Request对象表示一个HTTP请求,它包含请求的URL、方法(GET、POST等)、头部信息、以及请求体。Request对象可以通过使用Body混入来设置或获取请求的有效载荷。

例如,当使用fetch()函数发起一个POST请求时,可以将请求体作为参数传递给fetch()函数。这样,fetch()函数将创建一个新的Request对象,并将请求体设置为该对象的有效载荷。

fetch('https://api.example.com/data', {  
  method: 'POST',  
  headers: {  
    'Content-Type': 'application/json'  
  },  
  body: JSON.stringify({ name: 'John', age: 30 })  
});

在上面的例子中,使用JSON.stringify()方法将一个JavaScript对象转换为JSON字符串,并将其作为请求体传递给fetch()函数。这样,该对象将作为有效载荷被发送到服务器。

另一方面,Response对象表示服务器对请求的响应。它也使用了Fetch API的Body混入来实现其承载响应有效载荷的能力。

当服务器对请求进行响应时,响应体包含在Response对象中。可以使用Response对象的text()、json()、blob()等方法来获取响应体的内容。这些方法将解析响应体并返回解析后的结果。

例如,当服务器响应一个POST请求时,响应体可能包含JSON数据。可以使用Response对象的json()方法将响应体解析为JSON对象。

fetch('https://api.example.com/data', {  
  method: 'POST',  
  headers: {  
    'Content-Type': 'application/json'  
  },  
  body: JSON.stringify({ name: 'John', age: 30 })  
})  
.then(response => response.json())  
.then(data => console.log(data))  
.catch(error => console.log('Error:', error));

在上面的例子中,使用Response对象的json()方法将响应体解析为JSON对象,并将其打印到控制台。