这是我首选的范例(可能是每个人),服务器对于序列化其JSON响应仍然不感兴趣,因为它并不关心哪个客户端正在使用它。换句话说,我的django JSON有效载荷按照标准用蛇案编写。在此之前可以更新我的Redux存储中的状态,按照Javascript标准,密钥应该映射到camel case。 python开发人员不相信这是值得的,他有一个公平的观点,但是如果没有遵循惯例就感觉不对。
应如何处理?
答案 0 :(得分:3)
我通常拥有的是一个处理所有获取请求的中间件,在那里我可以拦截响应并使用Humps将密钥转换为camelCase。
// 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 },
},
});
我通常有一个实用程序来处理fetch,但这会让你知道如何处理camelCase转换。
答案 1 :(得分:1)
听起来你想要一个特殊的解析器和/或渲染器在驼峰盒和蛇盒之间来回切换。如果您使用的是Django Rest Framework,则可以使用JSONRenderer
创建新的子类,例如CamelCaseJSONRenderer
,以便它自动来回切换。
在base,你需要实现一个如下所示的函数:
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中的camelcase。