fetch请求返回的统一拦截 https://www.jb51.net/article/176925.htm
https://github.com/liubin915249126/javascript

错误信息

  1. const codeMessage = {
  2. 200: '服务器成功返回请求的数据。',
  3. 201: '新建或修改数据成功。',
  4. 202: '一个请求已经进入后台排队(异步任务)。',
  5. 204: '删除数据成功。',
  6. 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
  7. 401: '用户没有权限(令牌、用户名、密码错误)。',
  8. 403: '用户得到授权,但是访问是被禁止的。',
  9. 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
  10. 406: '请求的格式不可得。',
  11. 410: '请求的资源被永久删除,且不会再得到的。',
  12. 422: '当创建一个对象时,发生一个验证错误。',
  13. 500: '服务器发生错误,请检查服务器。',
  14. 502: '网关错误。',
  15. 503: '服务不可用,服务器暂时过载或维护。',
  16. 504: '网关超时。',
  17. }

AjaxRequest请求封装

  1. import qs from 'qs'
  2. const host = process.env.host
  3. interface ConfigProps extends RequestInit {
  4. token?: stirng;
  5. data?: object
  6. }
  7. async function http(url: string, props: ConfigProps = {}) {
  8. const {data, token, headers, ...arg} = props
  9. const params = {
  10. method: 'POST',
  11. headers: {
  12. "Content-Type": data ? "application/json" : "",
  13. "Authorization": token ? `Bearer ${token}` : "",
  14. },
  15. ...config
  16. }
  17. // get请求拼接 url
  18. if(params.method.toLocalUpperCase() === 'GET') {
  19. url += `?${qs.stringify(data)}`
  20. }
  21. else {
  22. params.body = JSON.stringify(data || {})
  23. }
  24. url += host + '/' + url
  25. return window.fetch(url, params)
  26. .then(async res => {
  27. const {status, code} = res
  28. if(status === 401) {
  29. await auth.logout()
  30. window.location.reload()
  31. return Promise.reject({message: '请重新登录'})
  32. }
  33. const data = await res.json()
  34. if (code) {
  35. return Promise.reject(data)
  36. }
  37. return data
  38. })
  39. .fanally()
  40. .catch()
  41. }
  42. export default http

useHttp使用fetch

  1. function useHttp() {
  2. const {user} = useAuth()
  3. return (...[url, params]: Parameters<typeof http>) =>
  4. http(url, {...params, token: user.token})
  5. }
  6. export defalut useHttp

组件使用

  1. import {useHttp} from '@hooks/useHttp'
  2. function List() {
  3. const [list, setList] = useState([])
  4. useEffect(() => {
  5. const data = cleanObject(debounceParams)
  6. useHttp('list', {data}).then(setList)
  7. }, [])
  8. }

fetch封装参考 https://blog.csdn.net/RRRRRDong/article/details/111468203