我可以使用axios拦截器将API请求替换为本地存储数据吗?

fsi0uk1n  于 8个月前  发布在  iOS
关注(0)|答案(2)|浏览(64)

我的应用程序中有一个API客户端,它带有一些拦截器:

const api = new OpenAPIClientAxios({...})
const client = api.initSync()
client.interceptors.request.use(...)
client.interceptors.response.use(...)

字符串
我想写一个请求拦截器,它将检查本地存储中的一些数据。如果数据存在,我想 * 根本不发出请求 *,而是简单地用本地存储数据进行响应。
这可能吗?还是我滥用了拦截器?

col17t5w

col17t5w1#

我想提出另一种方法:与其向axios添加拦截器,不如编写一个函数来抽象数据的检索,这将:

  • 检查本地数据,如果有,返回找到的数据
  • 否则执行远程调用

换句话说,编写域服务/存储库。

uemypmqf

uemypmqf2#

拦截器只能用于操作请求和响应的配置。不幸的是,您不能完全使用它们绕过请求。
Axios确实提供了一个adapter配置,
允许自定义处理请求
使用此方法,您可以使用自定义adapter创建Axios示例,以拦截请求并使用本地数据提供响应。

// mock localStorage
const localStorage = {s:{},setItem(k,v){this.s[k]=v},getItem(k){return this.s[k]??null}};
// mock OpenAPI client
const client = /* api.initSync() */ axios.create({ baseURL: "https://jsonplaceholder.typicode.com/" });

const wrapper = axios.create({
  adapter: ({ adapter, ...config }) => {
    const data = JSON.parse(localStorage.getItem("data"));
    if (data) {
      // return a valid response
      return Promise.resolve({
        data,
        config,
        status: 200,
      });
    }
    
    // otherwise pass-through to the real client
    return client(config);
  }
});

(async () => {
  // with no data present
  console.log("no local data:", (await wrapper.get("/todos/1")).data);

  // with local data
  localStorage.setItem("data", JSON.stringify({ foo: "FOO" }));
  console.log("with local data:", (await wrapper.get("/todos/1")).data);
})();
.as-console-wrapper { max-height: 100% !important; }
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>

相关问题