常用的数据交互方式?

一、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

posted @ 2020-09-15 09:46  程序員劝退师  阅读(358)  评论(0)    收藏  举报