将 Axios 请求参数和返回值进行格式化
1. 几种变量命名法
- 驼峰式 ( Camel Case )
- 大驼峰式( Pascal Case ):
GetUserName
- 小驼峰式:
getUserName
- 大驼峰式( Pascal Case ):
- 蛇式 ( Snake Case ):
- 小蛇式:
get_user_name
- 大蛇式:
GET_USER_NAME
- 小蛇式:
- 烤肉串式( Kebab Case ):
get-user-name
2. 场景
一些情况下,后端的接口返回值对于前端并不友好,比如后端可能倾向于使用 小蛇式, 如:
{
user_name: 'xxx',
email_address: 'xxx'
}
而前端比较熟悉的是:
{
userName: 'xxx',
emailAddress: 'xxx'
}
因此就需要使用相应的函数进行转换:
const reduce = require('lodash/reduce')
function createTransform (transformKey) {
function transformObject (value, depth = -1) {
if (depth === 0 || value == null || typeof value !== 'object') {
return value
}
if (Array.isArray(value)) {
return value.map(item => transformObject(item, depth - 1))
}
return _reduce(value, (prev, val, key) => {
// 将 key 进行转换
prev[transformKey(key)] = transformObject(val, depth - 1)
return prev
}, {})
}
return transformObject
}
2.1 转换返回结果
将蛇式转为驼峰式,将后端返回的结果进行转换
const camelCase = require('lodash/camelCase')
const deepCamcel = createTransform(camelCase)
deepCamcel({
a_b: {
c_d: {
e_f: 'g_h'
}
}
}))
// 结果
{
aB: {
cD: {
eF: 'g_h' // 注意,只会转换 key,不会转换内容
}
}
}
其中 depth 参数可以用来控制转换的层数:
deepCamcel({
a_b: {
c_d: {
e_f: 'g_h'
}
}
}, 1))
// 结果如下,即只转换对象的第一层 key
{
aB: {
c_d: {
e_f: 'g_h'
}
}
}
2.2 转换请求参数
同时,在请求时,我们也要将我们参数转换为后端需要的参数格式:
const snakeCase = require('lodash/snakeCase')
const deepSnake = createTransform(snakeCase)
deepSnake({
aB: {
cD: {
eF: 'gH'
}
}
})
// 结果
{
a_b: {
c_d: {
e_f: 'gH'
}
}
}
3. 与 Axios 结合
Axios 可以通过设置拦截器,在请求发出之前转换请求参数,在请求结果真正反应到页面之前转换返回结果:
转换请求参数
const snakeCase = require('lodash/snakeCase')
const deepSnake = createTransform(snakeCase)
// 使用拦截器
request.interceptors.request.use(transformKeysToSnakeCase);
function transformKeysToSnakeCase(config) {
// POST
if (config.data) {
config.data = deepSnake(config.data);
}
// GET
if (config.params) {
config.params = deepSnake(config.params);
}
return config;
}
转换返回结果
const camelCase = require('lodash/camelCase')
const deepCamcel = createTransform(camelCase)
// 使用拦截器
request.interceptors.response.use(transformKeysToCamelCase);
function transformKeysToCamelCase(response) {
if (response.data) {
let caseOptions = null;
if (response.config) {
caseOptions = response.config.responseCaseOptions;
}
response.data = deepCamcel(response.data);
}
return response;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论