axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)

fetch 是啥?

fetch 函数是 JavaScript 中用于发送网络请求的内置 API,可以替代传统的 XMLHttpRequest。它可以发送 HTTP 请求(如 GET、POST 等),并返回一个 Promise,从而简化异步操作

基本用法

js 复制代码
/*
下面是 fetch 的基本语法
url:请求的 URL(必需)
options:一个包含请求配置的对象(可选),如请求方法、请求头、请求体等。
*/
fetch(url, options)
  .then(response => {
    // 处理响应
  })
  .catch(error => {
    // 处理错误
  });

常见选项

参数 options 是一个对象,可以包含以下常见属性:

  • method:请求方法,例如 GET、POST、PUT、DELETE 等。默认是 GET。
  • headers:包含请求头的对象,通常用于设置 Content-Type 或授权信息。
  • body:请求体,用于传递数据(POST、PUT 请求时)。
  • mode:请求模式,如 cors、no-cors 和 same-origin。
  • credentials:指示是否发送 cookies,值为 omit(默认不发送)、same-origin(同源发送)或 include(跨域发送)。

GET 示例

js 复制代码
fetch('https://api.example.com/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json(); // 将响应解析为 JSON
  })
  .then(data => console.log(data))
  .catch(error => console.error('Fetch error:', error));

POST 示例

js 复制代码
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.error('Fetch error:', error));

上传文件

js 复制代码
const formData = new FormData();
formData.append('file', fileInput.files[0]); // 假设 fileInput 是一个文件输入

fetch('https://api.example.com/upload', {
  method: 'POST',
  body: formData
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Fetch error:', error));

封装实例

我们可以将常用的数据交互封装为一个函数,方便调用

js 复制代码
/**
 * 处理 Fetch,如果返回值不符合规范,则报错(可通过 .catch 获取)
 * @param {*} response
 * @returns
 */
const handleResponse = response=> response.json().then(json=>{
    if(response.ok && json.success===true)
        return json
    else
        return Promise.reject(json)
})

/**
 * 通用 FETCH 交互函数(POST)
 * @param {String} url - 后端地址
 * @param {Object} data - 表单数据
 * @param {Boolean} useJSON - 是否使用 JSON 格式提交
 * @param {Object} headers - 额外的请求头
 * @param {Function} handler - 处理函数,默认转换为 JSON 对象
 */
window.ajax = (url, data, useJSON=true, headers={}, handler=handleResponse)=>{
    let body = undefined
    if(useJSON){
        headers['Content-Type'] = 'application/json'
        body = JSON.stringify(data)
    }else{
        if(data){
            body = new FormData()
            Object.keys(data).forEach(k=> body.append(k, data[k]))
        }
    }

    return fetch(url, {method:"POST", headers, body}).then(handler)
}

使用示例

js 复制代码
ajax("/api", {name:"集成显卡"}).then(d=>console.debug(d))
相关推荐
AC赳赳老秦10 分钟前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
结网的兔子19 分钟前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
水瓶夜之40 分钟前
.NET 中的新增功能系列文章——.NET SDK中的新增功能
前端·chrome·.net
笨笨狗吞噬者1 小时前
VS Code 内置浏览器打开网页
前端
SamChan901 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
甲维斯1 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·人工智能
奈斯先生Vector2 小时前
大模型 Agentic Workflow 架构解构:异构 API 调度与 Token 路由的多模态系统设计
开发语言·前端·架构·prompt·aigc·音视频
海带紫菜菠萝汤2 小时前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
名字还没想好☜2 小时前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
Access开发易登软件2 小时前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access