在更新 Redux 状态之前规范化来自服务器的 JSON 响应
Normalizing JSON response from server before updating Redux state
这是我的首选范例(可能也是每个人的范例),即服务器对序列化其 JSON 响应保持冷静,因为它不关心哪个客户端正在使用它。换句话说,我的 django JSON 有效载荷是按照标准用蛇形写的。在这可以更新我的 Redux 存储中的状态之前,应根据 Javascript 标准将键映射到驼峰式大小写。 python 开发人员认为这不值得付出努力,他的观点有道理,但不遵循惯例感觉不对。
这个应该怎么处理??
听起来你想要一个特殊的解析器 and/or 渲染器来在驼峰式和蛇形式之间来回切换。如果你正在使用Django Rest Framework,你可以使用JSONRenderer
创建一个新的子类,例如CamelCaseJSONRenderer
,这样它会自动来回切换。
在基础上,您需要实现如下所示的函数:
def to_camelcase(string, lower_first_char=True):
"""Takes snakecase string and converts to camelcase."""
camelize = ''.join(char.capitalize() for char in word.split('_'))
result = (camelize[0].lower() + result[1:]) if lower_first else camelize
return result
def parse(data, lower_first=True):
"""Camelcase the keys of a dictionary or items of a list."""
if isinstance(data, dict):
result = {to_camelcase(k): parse(v) for k, v in data.items()}
elif isinstance(data, list):
result = [parse(item) for item in data]
else:
result = data
return result
然后您可以 运行 在自定义 CamelCaseJSONRenderer
中使用这些函数并将渲染器添加到您的视图中。这样一来,所有 python 对象在背面都是蛇形,在你的 javascript.
中是驼峰形
我通常有一个中间件来处理我所有的获取请求,在那里我可以拦截响应并使用 Humps 将键转换为驼峰命名法。
// fetchMiddleware.js
export default ({ dispatch, getState }) => next => (action) => {
if (typeof action === 'function') {
return action(dispatch, getState);
}
const { promise, types, ...rest } = action;
// this middleware expects a promise object in the action,
// the object contains all configurations to send the request to
// the server, if no promise is defined then it just ignores this action
if (!promise) {
return next(action);
}
return fetch(promise.url, promise)
.then(response => Promise.resolve(humps.camelizeKeys(response)))
.then(data => dispatch({ type: types[1], data }))
.catch(error => dispatch({ type: types[2], error }));
}
然后在某些组件或其他任何地方,将像这样调度操作:
store.dispatch({
types: ['BEFORE_REQUEST', 'REQUEST_SUCCESS', 'REQUEST_FAIL'],
promise: {
url: 'some/api.json',
params: { x, y },
},
});
我通常有一个实用程序来处理提取,但这会让您了解如何处理驼峰式转换。
这是我的首选范例(可能也是每个人的范例),即服务器对序列化其 JSON 响应保持冷静,因为它不关心哪个客户端正在使用它。换句话说,我的 django JSON 有效载荷是按照标准用蛇形写的。在这可以更新我的 Redux 存储中的状态之前,应根据 Javascript 标准将键映射到驼峰式大小写。 python 开发人员认为这不值得付出努力,他的观点有道理,但不遵循惯例感觉不对。
这个应该怎么处理??
听起来你想要一个特殊的解析器 and/or 渲染器来在驼峰式和蛇形式之间来回切换。如果你正在使用Django Rest Framework,你可以使用JSONRenderer
创建一个新的子类,例如CamelCaseJSONRenderer
,这样它会自动来回切换。
在基础上,您需要实现如下所示的函数:
def to_camelcase(string, lower_first_char=True):
"""Takes snakecase string and converts to camelcase."""
camelize = ''.join(char.capitalize() for char in word.split('_'))
result = (camelize[0].lower() + result[1:]) if lower_first else camelize
return result
def parse(data, lower_first=True):
"""Camelcase the keys of a dictionary or items of a list."""
if isinstance(data, dict):
result = {to_camelcase(k): parse(v) for k, v in data.items()}
elif isinstance(data, list):
result = [parse(item) for item in data]
else:
result = data
return result
然后您可以 运行 在自定义 CamelCaseJSONRenderer
中使用这些函数并将渲染器添加到您的视图中。这样一来,所有 python 对象在背面都是蛇形,在你的 javascript.
我通常有一个中间件来处理我所有的获取请求,在那里我可以拦截响应并使用 Humps 将键转换为驼峰命名法。
// fetchMiddleware.js
export default ({ dispatch, getState }) => next => (action) => {
if (typeof action === 'function') {
return action(dispatch, getState);
}
const { promise, types, ...rest } = action;
// this middleware expects a promise object in the action,
// the object contains all configurations to send the request to
// the server, if no promise is defined then it just ignores this action
if (!promise) {
return next(action);
}
return fetch(promise.url, promise)
.then(response => Promise.resolve(humps.camelizeKeys(response)))
.then(data => dispatch({ type: types[1], data }))
.catch(error => dispatch({ type: types[2], error }));
}
然后在某些组件或其他任何地方,将像这样调度操作:
store.dispatch({
types: ['BEFORE_REQUEST', 'REQUEST_SUCCESS', 'REQUEST_FAIL'],
promise: {
url: 'some/api.json',
params: { x, y },
},
});
我通常有一个实用程序来处理提取,但这会让您了解如何处理驼峰式转换。