Axios:如何拦截和响应Axios请求

sg24os4d  于 2023-11-18  发布在  iOS
关注(0)|答案(3)|浏览(170)

有没有一种方法不仅可以拦截,而且还可以在axios请求被发送之前对其进行响应?例如,从浏览器发送请求并从浏览器响应它+阻止它发送请求。
我知道我可以使用axios interceptors在请求和响应被发送并返回到组件之前拦截它们,我知道在请求拦截器中我可以抛出一个错误并触发响应拦截器,如果请求失败,我如何对成功的请求做同样的事情呢?在特定的条件下,我希望axios的响应就像它传递给服务器,而实际上它从来没有通过拦截器。这可能吗?
下面是我目前为止得到的伪代码:

  1. axios.interceptors.request.use(
  2. request => {
  3. if (localResponse) {
  4. throw { isLocal: true, data: { hello: 'world' } }; // <- this will stop request and trigger
  5. // response error. I want to trigger
  6. // the actual response callback
  7. } else {
  8. return request; // <- will perform full request
  9. }
  10. },
  11. error => {
  12. return Promise.reject(error);
  13. }
  14. );
  15. axios.interceptors.response.use(
  16. response => {
  17. return response; // <- I want to trigger this callback
  18. },
  19. error => { // <- so far i can only trigger a response error
  20. if (error?.isLocal) {
  21. return Promise.resolve(error.data);
  22. }
  23. return Promise.reject(error);
  24. }
  25. );

字符串
我已经尝试过只解析请求拦截器,但它试图继续满足请求。有人有任何创造性的想法来解决这个问题吗?也许有比使用拦截器更好的解决方案?

gopyfrb3

gopyfrb31#

设法自己编写一个解决方案。这样我所有的axios调用将不必改变,我可以只改变拦截器的行为。
注意事项:如果任何人想出一个更好的解决方案,我会很高兴地把他们的答案标记为正确的,并投赞成票。

解决方案

我是这样解决这个问题的

  1. axios.interceptors.request.use(
  2. request => {
  3. if (localResponse) {
  4. throw { isLocal: true, data: { hello: 'world' } }; // <- this will stop request and trigger
  5. // response error. I want to trigger
  6. // the actual response callback
  7. } else {
  8. return request; // <- will perform full request
  9. }
  10. },
  11. error => {
  12. return error?.isLocal
  13. ? Promise.resolve(error); // <- triggers response intercept
  14. : Promise.reject(error);
  15. }
  16. );
  17. axios.interceptors.response.use(
  18. response => {
  19. return response;
  20. },
  21. error => {
  22. error?.isLocal
  23. ? Promise.resolve(error); // <- sends as successful response
  24. : Promise.reject(error);
  25. }
  26. );

字符串
本质上,我所做的就是抛出一个错误来阻止请求通过,然后解决错误而不是拒绝它。这有点笨拙,但它完成了工作。

展开查看全部
klsxnrf1

klsxnrf12#

在本地场景中,您可以完全跳过请求吗?

  1. function getData() {
  2. if (localResponse) {
  3. return Promise.resolve({ isLocal: true, data: { hello: 'world' }});
  4. }
  5. else {
  6. return axios.whatever;
  7. }
  8. }
  9. ...
  10. getData().then(...)

字符串

vsmadaxz

vsmadaxz3#

您可以提供自定义adapter

  1. import axios, { getAdapter } from 'axios';
  2. const xhrAdapter = getAdapter('xhr');
  3. axios.defaults.adapter = (config) => {
  4. if (useLocal) {
  5. return Promise.resolve({
  6. data: yourData,
  7. status: 200,
  8. statusText: 'ok',
  9. headers: {},
  10. config: config,
  11. request: {}
  12. });
  13. }
  14. return xhrAdapter(config)
  15. }

字符串

展开查看全部

相关问题