指南

使用 JavaScript 发起请求

本文详细介绍浏览器发起请求的多种方式及 JavaScript 中使用 XMLHttpRequest 和 fetch 发送请求的技巧

🎯 引言

学完这篇文章,你将能够理解浏览器是如何发起网络请求的,掌握通过浏览器地址栏、表单提交以及 JavaScript 代码(包括 XMLHttpRequest 和 fetch)发送请求的核心方法。你还能学会如何查看请求详情、设置请求头、传递 JSON 数据,以及使用现代异步编程方式处理请求结果。这对于前端小白入门网络请求非常有帮助!


🌐 浏览器发起请求的方式

浏览器和服务器之间的通信,离不开 HTTP 请求。了解浏览器发起请求的方式,是理解网络交互的基础。

浏览器输入 URL 实现原理

当你在浏览器地址栏输入一个网址,比如 https://example.com,浏览器会做哪些事情呢?这其实是一个完整的请求流程:

  • 浏览器首先解析你输入的 URL,拆解出协议(HTTP/HTTPS)、域名、端口(默认 80 或 443)和路径。
  • 浏览器查找 DNS 服务器,将域名解析成对应的 IP 地址。
  • 浏览器与服务器建立 TCP 连接(HTTPS 还会额外做 TLS 握手)。
  • 浏览器构造一个 HTTP 请求报文,默认是 GET 请求。
  • 请求发送到服务器,服务器响应数据。

这整个过程支持你访问网页资源。可以把它想象成你给快递公司下了一个取件请求,先告诉他们地址(域名解析),准备好包裹(请求),等待快递员送来回复(服务器响应)。


使用地址栏发 GET 请求

地址栏发起的请求,默认都是 GET 请求。

这意味着浏览器把 URL 里的参数作为查询字符串直接发送给服务器。举个例子:

https://example.com/search?q=javascript

这里浏览器会向服务器发送请求,服务器获取 q=javascript,返回对应内容。

GET 请求的特点是安全且幂等(多次请求结果相同),适合获取数据,不适合提交重要数据。

表单提交实现 POST 请求

HTML 表单是用户与服务器交互的重要手段。表单通过设置 method="post" 可以发送 POST 请求。

示例表单:

<form action="/submit" method="post">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <button type="submit">提交</button>
</form>

当点击按钮时,浏览器会把表单数据序列化(默认是 application/x-www-form-urlencoded 格式),放在请求体里,发送给服务器。

POST 请求适合提交数据、上传文件等场景。

表单 POST 默认不会发送 JSON 格式数据,若你需要发送 JSON,请使用 JavaScript 的 fetch 或 XMLHttpRequest。

🎨 使用浏览器开发者工具查看请求(Network 面板)

网络请求细节可以通过浏览器自带的开发者工具查看。

打开方式通常是:

  • Windows/Linux:按 F12 或 Ctrl + Shift + I
  • Mac:按 Cmd + Option + I

切换到 Network(网络) 面板,你就能看到当前页面发出的所有请求列表。你可以点击具体请求,查看:

  • 请求头(Headers)
  • 请求体(Payload)
  • 响应数据(Response)
  • 时间信息(Timing)

这是调试请求问题和学习请求细节的最佳方式。


💻 使用 JavaScript 发起请求

现代前端开发离不开 JavaScript 发起请求,动态获取数据渲染页面。

XMLHttpRequest 基本用法

XMLHttpRequest(简称 XHR)是最早支持的网页异步请求对象。

基础示例 - GET 请求:

const xhr = new XMLHttpRequest();

xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1');

xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            console.log('响应数据:', xhr.responseText);
        } else {
            console.error('请求失败,状态码:', xhr.status);
        }
    }
};

xhr.send();

上面代码解释:

  • open 设置请求方法和地址
  • 通过回调函数监听状态变化
  • 状态码 200 表示成功,拿到响应文本

使用 fetch() 发送 GET / POST 请求

fetch 是现代浏览器提供的请求接口,基于 Promise,写法更简洁。

GET 请求示例:

fetch('https://jsonplaceholder.typicode.com/posts/1')
    .then(response => {
        if (!response.ok) {
            throw new Error('网络响应失败');
        }
        return response.json();
    })
    .then(data => {
        console.log('获取的数据:', data);
    })
    .catch(error => {
        console.error('请求错误:', error);
    });

POST 请求示例,带 JSON 数据:

fetch('https://jsonplaceholder.typicode.com/posts', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        title: 'foo',
        body: 'bar',
        userId: 1,
    }),
})
    .then(response => response.json())
    .then(data => console.log('服务器响应:', data))
    .catch(error => console.error('请求失败:', error));

设置请求头与传递 JSON 数据

发送 JSON 数据时,必须设置请求头 Content-Typeapplication/json,并将 JS 对象转换成 JSON 字符串。

const data = { name: '张三', age: 25 };

fetch('/api/user', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify(data),
});

如果你不设置正确的 Content-Type,服务器可能无法正确解析请求体。


使用 async/await 编写异步请求

async/await 让异步代码写起来更像同步,结构更清晰。

示例 GET 请求:

async function fetchUser() {
    try {
        const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
        if (!response.ok) {
            throw new Error('请求失败,状态码:' + response.status);
        }
        const user = await response.json();
        console.log('用户信息:', user);
    } catch (error) {
        console.error('请求出错:', error);
    }
}

fetchUser();

错误与异常处理(try/catch)

在异步请求中,网络异常、服务器错误都可能发生,使用 try/catch 捕获异常是最佳实践。

无论是 fetch 还是 async/await,都要记得处理异常,避免页面崩溃或无响应。


提示

  • 浏览器地址栏直接敲 URL 是最直观的 GET 请求示例。
  • 表单提交 POST 请求时,数据格式有限,JavaScript 发请求更灵活。
  • 新手推荐先用 fetch + async/await,写法简洁,易于理解。
  • 使用开发者工具 Network 面板是调试请求的利器。

🧾 小节总结

  • 浏览器发起请求包括地址栏输入 GET 请求和表单提交 POST 请求两种常见方式。
  • JavaScript 提供 XMLHttpRequest 和 fetch 两个主要接口发起请求,fetch 更现代、简洁。
  • 发起请求时要注意设置请求头,传递 JSON 数据,并使用 try/catch 处理异常。

❓ 知识问答(Q&A)

Q:浏览器地址栏输入的网址默认发送什么请求?

A:默认发送 GET 请求,用于获取资源。

Q:如何使用 JavaScript 发送 POST 请求并传递 JSON 数据?

A:使用 fetch,设置 method: 'POST',添加请求头 'Content-Type': 'application/json',并将数据 JSON.stringify() 后放入 body

Q:为什么要使用 try/catch 包裹异步请求代码?

A:为了捕获网络异常和请求失败,防止程序崩溃,提高用户体验。


🧪 小练习

练习 1:使用 fetch 写一个函数,向 https://jsonplaceholder.typicode.com/posts 发送一个 POST 请求,提交一篇文章(title 和 body),并打印服务器返回的数据。

async function createPost() {
    // 在这里写你的代码
}
createPost();

练习 2:使用 XMLHttpRequest 发送一个 GET 请求,获取 https://jsonplaceholder.typicode.com/users/1 用户信息,并将结果打印到控制台。

function getUser() {
    // 在这里写你的代码
}
getUser();

🎉 恭喜你已经掌握 浏览器请求原理、JavaScript 异步请求、fetch 用法 三大技能啦!祝你前端学习之路越走越顺!