HTTP 方法测试器 - GET/POST/PUT/DELETE 等演示
向指定 URL 发送不同 HTTP 方法的请求,显示响应状态码、头部和主体,学习 RESTful API。
UD5工具箱
// handlers.js - 定义请求处理器
import { http, HttpResponse } from 'msw'
export const handlers = [
// 拦截 GET /api/users
http.get('/api/users', () => {
return HttpResponse.json([
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' }
])
}),
// 带路径参数的处理器
http.get('/api/users/:id', ({ params }) => {
const { id } = params
return HttpResponse.json({
id: Number(id),
name: `User ${id}`,
email: `user${id}@example.com`
})
}),
// 模拟登录
http.post('/api/login', async ({ request }) => {
const body = await request.json()
if (body.username === 'admin') {
return HttpResponse.json({ token: 'mock-jwt-token', role: 'admin' })
}
return HttpResponse.json(
{ error: 'Invalid credentials' },
{ status: 401 }
)
})
]
// browser.js - 浏览器端Service Worker设置
import { setupWorker } from 'msw/browser'
import { handlers } from './handlers'
// 创建Service Worker实例
export const worker = setupWorker(...handlers)
// 启动worker(在开发环境中)
// worker.start({
// onUnhandledRequest: 'bypass', // 未匹配的请求放行
// quiet: false, // 显示详细日志
// })
// main.js 或 index.js - 应用入口
import { worker } from './mocks/browser'
async function bootstrap() {
// 开发环境中启动MSW
if (import.meta.env.DEV) {
await worker.start({
onUnhandledRequest: 'bypass',
serviceWorker: {
url: '/mockServiceWorker.js'
}
})
console.log('🚀 MSW started - mocking enabled')
}
// 启动应用
const app = createApp()
app.mount('#app')
}
bootstrap()
// 测试中使用MSW (Vitest/Jest)
import { setupServer } from 'msw/node'
import { handlers } from './handlers'
const server = setupServer(...handlers)
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
afterEach(() => server.resetHandlers())
afterAll(() => server.close())
test('fetches users successfully', async () => {
const response = await fetch('/api/users')
const users = await response.json()
expect(response.status).toBe(200)
expect(users).toHaveLength(2)
expect(users[0].name).toBe('Alice')
})
test('handles login failure', async () => {
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ username: 'wrong' })
})
expect(response.status).toBe(401)
})
| 特性 | MSW | json-server | axios拦截器 |
|---|---|---|---|
| 拦截层级 | 网络层(Service Worker) | 独立服务器 | 库级别 |
| 支持请求库 | 所有(fetch/XHR/GraphQL) | 所有 | 仅axios |
| DevTools可见 | ✅ 是 | ✅ 是 | ❌ 否 |
| 代码侵入 | 零侵入 | 需配置baseURL | 需修改拦截器 |
| 测试复用 | ✅ 完美复用 | 需启动服务 | 部分复用 |
| 离线开发 | ✅ 支持 | 需本地服务 | ✅ 支持 |
if (process.env.NODE_ENV === 'development') { await worker.start() }mockServiceWorker.js 不应部署到生产服务器start() 方法在调用前会检查环境,但最佳实践是在代码层面做好隔离graphql.link() 和 graphql.query() 处理器fetch()、axios、XMLHttpRequest、@apollo/client 还是 react-query,MSW 都能在底层统一拦截。
npm install msw@latest --save-devnpx msw init ./public --savesrc/mocks/handlers.js,使用 http.get/post/put/delete 定义拦截规则if (dev) { await worker.start() }window.fetch,替换为自定义函数,在函数中检查mock规则并返回模拟的 Response 对象XMLHttpRequest.prototype 的 open 和 send 方法向指定 URL 发送不同 HTTP 方法的请求,显示响应状态码、头部和主体,学习 RESTful API。
注册一个后台同步任务,展示如何在网络恢复后自动同步表单提交等操作。
配置事件类型和重试间隔,生成用于接收 SSE 的前端 EventSource 代码和后端流示例。
在同一数据上运行多种数组遍历方式,测量并比较它们的执行时间,辅助性能优化决策。
创建当用户离线时展示的简单HTML页面,结合Service Worker使用。
在散点图上拖拽数据点,实时更新最小二乘回归线,显示斜率和截距。
展示各种 HTML5 验证属性(required, pattern, min, max 等)和自定义验证消息的效果。
模拟多层代理逐步添加 X-Forwarded-For 头的过程,理解如何获取真实客户端 IP。
输入一个 Snowflake 格式的数字 ID,解析出生成时间戳、数据中心、机器编号和序列号。
创建一个测试自定义元素,记录并展示 connectedCallback, attributeChangedCallback 等执行顺序。
粘贴Link rel=preload头字段,解析展示服务器计划推送的资源列表。
在单页内模拟MPA过渡效果,自定义进场/出场动画,体验View Transitions API丝滑切换。
发起请求获取当前URL或任意允许CORS的URL的Response Headers,展示详情。
在前端创建模拟 SSE 连接,接收服务器推送的消息流并实时渲染到页面。
定义端点、JSON响应体和延迟毫秒,模拟后端API供前端本地开发调试。
定义字段名称和类型(姓名、邮箱、数字范围等),批量生成符合规则的 JSON 模拟数据。
使用原生HTML Popover属性创建提示、菜单与对话框,展示四种触发方式及样式定制。
自定义发送者和消息内容,生成逼真的聊天对话界面截图,用于演示或原型。
捕捉页面粘贴事件,展示文本、HTML 或图片数据,演示如何定制粘贴行为。
输入常见的报错片段,基于静态库返回常见的解释和可能的修复方案。
设置不同验证属性和自定义消息,测试HTML5表单验证触发效果。
创建活动链接,分享后收集参与者出席回应,实时显示参与、婉拒与未回复名单。
展示一些常用内置HTML元素和自定义元素例子,提供代码复制。
选择平台和分享参数,生成分享到Twitter、Facebook、WhatsApp等的URL链接及按钮。
生成带有动画的点赞/点踩或表情反馈组件,包含选中状态和计数。
根据输入的外部域名,生成 dns-prefetch、preconnect 和 preload 标签。
应用屏幕唤醒锁并监听其释放事件,展示前后台切换时的状态变化。
选择各种数据类型演示structuredClone的深拷贝能力,对比JSON.parse的限制。
对简单混淆的JS进行格式化,并尝试将短变量名替换为更具描述性的名称,提高可读性。
列出所有 Reflect 静态方法,提供参数输入并执行,查看返回值和副作用。