AJAX是什么,如何实现一个AJAX请求

5 阅读2分钟

AJAX 是什么?

AJAX(Asynchronous JavaScript and XML)是一种使用 JavaScript 在无需重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容的技术。它是创建异步 Web 应用的核心技术。

核心特点:

  • 异步通信:浏览器在后台与服务器通信,用户无需等待
  • 局部更新:只更新页面中需要变化的部分
  • 无需插件:基于原生 JavaScript,无需额外插件

实现 AJAX 请求的几种方式

1. 使用原生 XMLHttpRequest(传统方式)

// 创建 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();

// 配置请求
xhr.open('GET', 'https://api.example.com/data', true); // true 表示异步

// 设置请求头(可选)
xhr.setRequestHeader('Content-Type', 'application/json');

// 处理响应
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) { // 请求完成
        if (xhr.status === 200) { // 成功
            const data = JSON.parse(xhr.responseText);
            console.log('成功:', data);
        } else {
            console.error('错误:', xhr.status);
        }
    }
};

// 发送请求
xhr.send();

2. 使用 Fetch API(现代方式,推荐)

// GET 请求
fetch('https://api.example.com/data')
    .then(response => {
        if (!response.ok) {
            throw new Error('网络响应不正常');
        }
        return response.json(); // 解析 JSON
    })
    .then(data => {
        console.log('成功:', data);
    })
    .catch(error => {
        console.error('错误:', error);
    });

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

3. 使用 async/await(更简洁)

async function fetchData() {
    try {
        const response = await fetch('https://api.example.com/data');
        
        if (!response.ok) {
            throw new Error(`HTTP 错误: ${response.status}`);
        }
        
        const data = await response.json();
        console.log('数据:', data);
        return data;
    } catch (error) {
        console.error('请求失败:', error);
    }
}

// 调用
fetchData();

4. 使用 axios(第三方库,功能更强大)

// 首先需要引入 axios
// <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

// GET 请求
axios.get('https://api.example.com/data')
    .then(response => {
        console.log('数据:', response.data);
    })
    .catch(error => {
        console.error('错误:', error);
    });

// POST 请求
axios.post('https://api.example.com/data', {
    name: '李四',
    age: 30
})
.then(response => {
    console.log('响应:', response.data);
});

完整的 AJAX 封装示例

class AjaxRequest {
    constructor(baseURL = '') {
        this.baseURL = baseURL;
    }

    async request(url, options = {}) {
        const defaultOptions = {
            headers: {
                'Content-Type': 'application/json',
            },
            ...options
        };

        try {
            const response = await fetch(`${this.baseURL}${url}`, defaultOptions);
            
            // 检查响应状态
            if (!response.ok) {
                throw new Error(`HTTP ${response.status}: ${response.statusText}`);
            }
            
            // 根据内容类型解析响应
            const contentType = response.headers.get('content-type');
            let data;
            
            if (contentType && contentType.includes('application/json')) {
                data = await response.json();
            } else {
                data = await response.text();
            }
            
            return {
                success: true,
                data,
                status: response.status,
                headers: response.headers
            };
        } catch (error) {
            console.error('AJAX 请求失败:', error);
            return {
                success: false,
                error: error.message
            };
        }
    }

    get(url, params = {}) {
        // 构建查询字符串
        const queryString = new URLSearchParams(params).toString();
        const fullUrl = queryString ? `${url}?${queryString}` : url;
        
        return this.request(fullUrl, {
            method: 'GET'
        });
    }

    post(url, data = {}) {
        return this.request(url, {
            method: 'POST',
            body: JSON.stringify(data)
        });
    }

    put(url, data = {}) {
        return this.request(url, {
            method: 'PUT',
            body: JSON.stringify(data)
        });
    }

    delete(url) {
        return this.request(url, {
            method: 'DELETE'
        });
    }
}

// 使用示例
const api = new AjaxRequest('https://api.example.com');

// 获取数据
api.get('/users')
    .then(result => {
        if (result.success) {
            console.log('用户数据:', result.data);
        }
    });

// 提交数据
api.post('/users', { name: '王五', age: 28 })
    .then(result => {
        if (result.success) {
            console.log('创建成功:', result.data);
        }
    });

关键注意事项

  1. 跨域请求:需要服务器设置 CORS(跨源资源共享)头
  2. 错误处理:始终要处理可能的错误
  3. 超时设置:为长时间请求设置超时
  4. 安全性:验证和清理用户输入
  5. 取消请求:使用 AbortController 取消进行中的请求

现代 Web 开发中,推荐使用 Fetch API 或 axios,它们提供了更简洁的语法和更好的错误处理机制。