我有一个关于 redux observable 和 ajax 请求的问题。
自从我开始学习 React 以来,我一直在使用 redux observable。
所以我其实想问有没有办法拦截所有ajax请求来设置baseurl n headers?
让我告诉你我如何在ajax中做到这一点。我简单地制作了 4 个基本函数 ajaxGet、ajaxPost、ajaxDel 和 ajaxPut。并使用这些函数来调用应用程序中各处的 API。
在这些基本函数中,我设置了 baseurl 和默认标头。
如果有人找到了更好的方法,例如基本拦截器或除创建基本函数之外的其他方法,请告诉我。
还有一个问题是,大多数人在使用 redux observable 和 rxjs 时如何在应用程序中编写刷新令牌机制。
我在许多应用程序中都遵循了本教程。
使用 AJAX RXJS 的拦截器提案
拦截器
import { AjaxConfig, ajax } from 'rxjs/ajax';
import { catchError, throwError, retry, switchMap } from 'rxjs';
import authenticateService from './authenticate.service';
const ajaxIntercept = (req: AjaxConfig) => {
req.headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${localStorage.getItem('token')}`,
};
return ajax(req).pipe(
catchError(error => {
if (error.status === 401) {
return authenticateService.observableDataToken().pipe(
switchMap(r => {
const token = r.response.data.token;
localStorage.setItem('token', token);
req.headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
};
return throwError(() => req);
}),
);
} else {
return throwError(() => req);
}
}),
retry(2),
);
};
export default ajaxIntercept;
使用拦截器
import { AjaxResponse } from 'rxjs/ajax';
const requestFunction = (id: string, body:modelbody) => {
ajaxIntercept({
url: `${API}example/${id}`,
method: 'POST',
body: body,
}).subscribe({
next: r => {
const data = r as AjaxResponse<youModel>;
},
error: e => {
/** */
},
});
};
重要注意事项