fetch请求返回的统一拦截 https://www.jb51.net/article/176925.htm
https://github.com/liubin915249126/javascript
错误信息
const codeMessage = {200: '服务器成功返回请求的数据。',201: '新建或修改数据成功。',202: '一个请求已经进入后台排队(异步任务)。',204: '删除数据成功。',400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',401: '用户没有权限(令牌、用户名、密码错误)。',403: '用户得到授权,但是访问是被禁止的。',404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',406: '请求的格式不可得。',410: '请求的资源被永久删除,且不会再得到的。',422: '当创建一个对象时,发生一个验证错误。',500: '服务器发生错误,请检查服务器。',502: '网关错误。',503: '服务不可用,服务器暂时过载或维护。',504: '网关超时。',}
AjaxRequest请求封装
import qs from 'qs'const host = process.env.hostinterface ConfigProps extends RequestInit {token?: stirng;data?: object}async function http(url: string, props: ConfigProps = {}) {const {data, token, headers, ...arg} = propsconst params = {method: 'POST',headers: {"Content-Type": data ? "application/json" : "","Authorization": token ? `Bearer ${token}` : "",},...config}// get请求拼接 urlif(params.method.toLocalUpperCase() === 'GET') {url += `?${qs.stringify(data)}`}else {params.body = JSON.stringify(data || {})}url += host + '/' + urlreturn window.fetch(url, params).then(async res => {const {status, code} = resif(status === 401) {await auth.logout()window.location.reload()return Promise.reject({message: '请重新登录'})}const data = await res.json()if (code) {return Promise.reject(data)}return data}).fanally().catch()}export default http
useHttp使用fetch
function useHttp() {const {user} = useAuth()return (...[url, params]: Parameters<typeof http>) =>http(url, {...params, token: user.token})}export defalut useHttp
组件使用
import {useHttp} from '@hooks/useHttp'function List() {const [list, setList] = useState([])useEffect(() => {const data = cleanObject(debounceParams)useHttp('list', {data}).then(setList)}, [])}
fetch封装参考 https://blog.csdn.net/RRRRRDong/article/details/111468203
