常用的数据交互方式?
一、Ajax
1 export default async function Request(url = '', method='GET', data={}) { 2 // 1. 创建连接 3 const xhr = new XMLHttpRequest() 4 // 2. 连接服务器 5 xhr.open(method, url, true) 6 // 3. 发送请求 7 xhr.send(null); 8 // 4. 接受请求 9 xhr.onreadystatechange = function () { 10 // readyState 为 XMLHttpRequest 的状态:0:请求未初始化 1:服务器连接已建立 2: 请求已接收 3: 请求处理中 4:请求已完成 11 if (xhr.readyState === 4) { 12 // status 200 为 ok,404 未找到页面 13 if (xhr.status === 200) { 14 // 获取数据 15 } else { // fail 16 // 错误处理 17 } 18 } 19 } 20 }
二、Fetch
1 export default async function request(url = '', method = 'GET', data = {}) { 2 let response: any; 3 if (method.toLocaleUpperCase() === 'GET') { 4 // GET请求数据格式 5 if (typeof data === 'object') { 6 let getData = Object.keys(data) 7 .map(key => `${key}=${data[key]}`) 8 .join('&'); 9 let getUrl = `${url}?${getData}`; 10 response = await fetch(getUrl, { 11 method: 'GET', 12 }); 13 } 14 } else if (method.toLocaleUpperCase() === 'POST') { 15 // POST请求数据格式 16 let postData = new FormData(); 17 Object.keys(data).forEach(key => { 18 postData.append(key, data[key]); 19 }); 20 let postUrl = url; 21 response = await fetch(postUrl, { 22 method: 'POST', 23 body: postData, 24 }); 25 } 26 // 返回结果 27 try { 28 let result = await response.json(); 29 switch (result.code) { 30 case 200: 31 return result; 32 case 400: 33 // 错误处理 34 break; 35 default: 36 return result; 37 } 38 } catch (error) { 39 // 错误处理 40 throw error; 41 } finally { 42 // 返回结果 43 } 44 }
三、axios
1 import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; 2 3 // 实例化axios 4 const instance = axios.create({ 5 timeout: 10000, 6 transformRequest: [ 7 function (data) { 8 return data; 9 }, 10 ], 11 transformResponse: [ 12 function (data) { 13 return JSON.parse(data); 14 }, 15 ], 16 }); 17 18 // 请求拦截器 19 instance.interceptors.request.use( 20 (config: AxiosRequestConfig) => { 21 const data = config.data; 22 if (config.method ? .toUpperCase() === 'GET' ) { 23 const getData = Object.keys(data) 24 .map(key => `${key}=${data[key]}`) 25 .join('&'); 26 config.data = getData; 27 } else { 28 const postData = new FormData(); 29 Object.keys(data).forEach(key => { 30 if (typeof data[key] === 'object') { 31 data[key] = JSON.stringify(data[key]); 32 } 33 postData.append(key, data[key]); 34 }); 35 config.data = postData; 36 } 37 return config; 38 }, 39 error => { 40 return Promise.reject(error); 41 }, 42 ); 43 44 // 响应拦截 45 instance.interceptors.response.use( 46 (response: AxiosResponse) => { 47 const result = response.data; 48 switch (result.code) { 49 case 200: 50 return Promise.resolve(result.data); 51 case 400: 52 // 错误处理 53 return Promise.resolve(false); 54 default: 55 return result; 56 } 57 }, 58 error => { 59 return Promise.reject(error); 60 }, 61 ); 62 63 // 封装GET,POST请求 64 export default async function Request(url = '', method = 'GET', data = {}, config = {}) { 65 return new Promise((resolve, reject) => { 66 instance({ 67 method, 68 url, 69 data, 70 ...config, 71 }) 72 .then(response => { 73 resolve(response); 74 }) 75 .catch(error => { 76 reject(error); 77 }); 78 }); 79 }
四、websocket

浙公网安备 33010602011771号