| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /**
- * FeHelper Postman Mock Server
- * 基于Service Worker实现的本地POST请求模拟服务器
- */
- // 模拟的API端点配置
- const MOCK_APIS = {
- '/api/mock': {
- method: 'POST',
- response: {
- success: true,
- message: 'Mock服务器响应成功',
- timestamp: new Date().toISOString(),
- data: {
- id: 1001,
- name: 'FeHelper Mock API',
- version: '1.0.0',
- description: '这是一个基于Service Worker的模拟API服务器'
- }
- },
- delay: 500 // 模拟网络延迟
- },
- '/api/user/login': {
- method: 'POST',
- response: {
- success: true,
- message: '登录成功',
- token: 'mock_jwt_token_' + Date.now(),
- user: {
- id: 1001,
- username: 'testuser',
- email: '[email protected]',
- role: 'admin'
- }
- },
- delay: 300
- },
- '/api/data/create': {
- method: 'POST',
- response: {
- success: true,
- message: '数据创建成功',
- id: Math.floor(Math.random() * 10000),
- createdAt: new Date().toISOString()
- },
- delay: 800
- }
- };
- // 监听fetch事件
- self.addEventListener('fetch', (event) => {
- const url = new URL(event.request.url);
- const pathname = url.pathname;
-
- // 检查是否是我们的Mock API端点
- const mockApi = MOCK_APIS[pathname];
-
- if (mockApi && event.request.method === mockApi.method) {
- event.respondWith(handleMockRequest(event.request, mockApi));
- }
- });
- // 处理Mock请求
- async function handleMockRequest(request, mockApi) {
- try {
- // 模拟网络延迟
- await new Promise(resolve => setTimeout(resolve, mockApi.delay));
-
- // 获取请求体数据
- let requestData = null;
- try {
- const contentType = request.headers.get('content-type');
- if (contentType && contentType.includes('application/json')) {
- requestData = await request.json();
- } else if (contentType && contentType.includes('application/x-www-form-urlencoded')) {
- const formData = await request.text();
- requestData = parseFormData(formData);
- }
- } catch (e) {
- console.log('Mock Server: 无法解析请求体', e);
- }
-
- // 构建响应数据
- const responseData = {
- ...mockApi.response,
- request: {
- method: request.method,
- url: request.url,
- headers: Object.fromEntries(request.headers.entries()),
- body: requestData
- },
- server: {
- name: 'FeHelper Mock Server',
- version: '1.0.0',
- poweredBy: 'Service Worker'
- }
- };
-
- // 返回响应
- return new Response(JSON.stringify(responseData, null, 2), {
- status: 200,
- statusText: 'OK',
- headers: {
- 'Content-Type': 'application/json; charset=utf-8',
- 'Access-Control-Allow-Origin': '*',
- 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
- 'Access-Control-Allow-Headers': 'Content-Type, Authorization',
- 'X-Powered-By': 'FeHelper Mock Server',
- 'X-Response-Time': mockApi.delay + 'ms'
- }
- });
-
- } catch (error) {
- // 错误响应
- return new Response(JSON.stringify({
- success: false,
- error: 'Mock服务器内部错误',
- message: error.message,
- timestamp: new Date().toISOString()
- }, null, 2), {
- status: 500,
- statusText: 'Internal Server Error',
- headers: {
- 'Content-Type': 'application/json; charset=utf-8'
- }
- });
- }
- }
- // 解析表单数据
- function parseFormData(formDataString) {
- const params = new URLSearchParams(formDataString);
- const result = {};
- for (const [key, value] of params) {
- result[key] = value;
- }
- return result;
- }
- // Service Worker安装事件
- self.addEventListener('install', (event) => {
- console.log('FeHelper Mock Server: Service Worker 已安装');
- self.skipWaiting();
- });
- // Service Worker激活事件
- self.addEventListener('activate', (event) => {
- console.log('FeHelper Mock Server: Service Worker 已激活');
- event.waitUntil(self.clients.claim());
- });
- console.log('FeHelper Mock Server: Service Worker 已加载');
|