返回

如何用axios拦截器解决后端接口数据乘以100k的烦恼

前端

后端接口数据取值乘以100k?如何巧用axios拦截器轻松解决

在最近开发一个电商项目时,我发现后端接口文档中所有与金额相关的字段都标注着"multiply 100k"。经询问后得知,这是为了避免一些精度问题。

精度问题:数据传输中的隐患

在前后端数据传输过程中,小数和大整数可能会出现精度问题。这是因为:

  • 浮点数在计算机中使用有限位数表示,会导致精度损失。
  • 整数虽然没有精度问题,但如果值过大,可能会超过计算机的可表示范围。

multiply 100k:后端的处理方式

为了解决这个问题,后端采取了"multiply 100k"的策略:

  • 将所有金额乘以 100k,转化为整数。
  • 这样,精度问题就转化为单位问题,前端只需除以 100k 即可恢复原值。

axios拦截器:前端的优雅解决方案

虽然后端的处理方式有效,但对于前端来说,每次都要手动除以 100k 并不方便。这时候,我们可以使用axios拦截器来解决这个问题。

axios拦截器是一个允许我们拦截axios请求和响应的机制。我们可以利用它来对金额字段进行处理:

// 创建请求拦截器
axios.interceptors.request.use((config) => {
  // 如果请求中包含金额字段
  if (config.data && config.data.amount) {
    // 将金额除以 100k
    config.data.amount /= 100000;
  }
  return config;
});

// 创建响应拦截器
axios.interceptors.response.use((response) => {
  // 如果响应中包含金额字段
  if (response.data && response.data.amount) {
    // 将金额乘以 100k
    response.data.amount *= 100000;
  }
  return response;
});

通过这两个拦截器,我们可以在发送请求前将金额除以 100k,在接收响应后将金额乘以 100k。这样,前端代码中就可以直接使用原始金额,而无需再进行手动转换。

代码示例

使用axios拦截器处理金额的代码示例如下:

import axios from "axios";

// 创建axios实例
const instance = axios.create();

// 拦截请求
instance.interceptors.request.use((config) => {
  if (config.data && config.data.amount) {
    config.data.amount /= 100000;
  }
  return config;
});

// 拦截响应
instance.interceptors.response.use((response) => {
  if (response.data && response.data.amount) {
    response.data.amount *= 100000;
  }
  return response;
});

// 使用axios实例发送请求
instance.get("/api/orders").then((response) => {
  // 获取订单中的金额,无需手动转换
  const amount = response.data.amount;
});

总结

通过使用axios拦截器,我们可以优雅地解决后端接口数据乘以 100k的问题。这样,前端代码就可以直接使用原始金额,大大简化了开发过程。