JavaScript教程:深入理解fetch API的网络请求

JavaScript教程:深入理解fetch API的网络请求

ko.javascript.info 모던 JavaScript 튜토리얼(The Modern JavaScript Tutorial in Korean ) ko.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ko/ko.javascript.info

引言:现代JavaScript中的网络请求

在现代Web开发中,与服务器进行异步通信是至关重要的功能。JavaScript提供了多种方式来实现这一目标,其中fetch() API是最为现代和强大的解决方案之一。

什么是fetch API?

fetch()是JavaScript内置的一个全局方法,用于发起网络请求并获取资源。它基于Promise设计,提供了简洁而强大的接口来处理HTTP请求和响应。

基本语法

let promise = fetch(url, [options])
  • url:要访问的URL地址
  • options:可选参数对象,可配置请求方法、头部信息等

请求流程详解

第一阶段:响应头接收

当调用fetch()时,浏览器会立即返回一个Promise对象。这个Promise会在服务器响应头到达时解析,但此时响应体可能还未完全接收。

let response = await fetch(url);

if (response.ok) {  // HTTP状态码在200-299之间
  let json = await response.json();
} else {
  console.error("HTTP错误: " + response.status);
}

第二阶段:响应体处理

在确认请求成功后,我们可以使用多种方法来处理响应体:

  • response.text():获取文本格式的响应
  • response.json():解析JSON格式的响应
  • response.blob():处理二进制数据
  • response.arrayBuffer():处理底层二进制数据
  • response.formData():处理表单数据

实际应用示例

获取JSON数据

async function fetchCommits() {
  let response = await fetch('https://api.example.com/repos/project/commits');
  
  if (response.ok) {
    let commits = await response.json();
    console.log(commits[0].author);
  } else {
    console.error("加载失败: " + response.status);
  }
}

发送POST请求

async function sendData() {
  let user = {
    name: '张三',
    age: 30
  };

  let response = await fetch('/api/user', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: JSON.stringify(user)
  });

  let result = await response.json();
  console.log(result.message);
}

上传图片

async function uploadImage(canvasElement) {
  let blob = await new Promise(resolve => 
    canvasElement.toBlob(resolve, 'image/png'));
  
  let response = await fetch('/api/upload', {
    method: 'POST',
    body: blob
    // 注意:Blob会自动设置Content-Type
  });

  let result = await response.json();
  console.log(`图片已上传,大小: ${result.size}字节`);
}

重要注意事项

  1. 响应体只能读取一次:一旦使用某个方法读取了响应体,就不能再用其他方法读取了。
// 错误示例
let text = await response.text();  // 响应体已被消费
let json = await response.json();  // 这里会报错
  1. 请求头限制:某些请求头是浏览器保留的,不能通过JavaScript设置(如CookieHost等)。

  2. 错误处理:网络问题会导致Promise被拒绝,而HTTP错误状态码(如404)则不会。

高级特性

自定义请求头

let response = await fetch('/api/data', {
  headers: {
    'X-Custom-Header': 'value',
    'Authorization': 'Bearer token123'
  }
});

处理不同类型的数据

根据服务器返回的数据类型,选择合适的方法处理:

// 处理文本
let text = await response.text();

// 处理JSON
let data = await response.json();

// 处理二进制数据
let blob = await response.blob();
let img = document.createElement('img');
img.src = URL.createObjectURL(blob);
document.body.append(img);

总结

fetch API提供了现代、灵活的方式来处理网络请求,具有以下特点:

  1. 基于Promise,支持async/await语法
  2. 提供多种响应处理方法
  3. 支持各种HTTP方法和自定义头部
  4. 可以发送多种格式的数据

通过合理使用fetch,开发者可以构建出高效、响应式的Web应用程序,实现无缝的用户体验。

在后续学习中,可以进一步探索fetch的高级用法,如请求取消、进度跟踪等特性,以满足更复杂的应用场景需求。

ko.javascript.info 모던 JavaScript 튜토리얼(The Modern JavaScript Tutorial in Korean ) ko.javascript.info 项目地址: https://gitcode.com/gh_mirrors/ko/ko.javascript.info

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岑晔含Dora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值