2017-08-24 5 views
3

これは、どのクライアントがそれを消費しているかを気にしないので、サーバーがJSON応答をシリアル化することについて、私が望んでいるパラダイムです。言い換えれば、私のdjango JSONペイロードは標準ごとにスネークケースで書かれています。これが私のReduxストアの状態を更新する前に、キーはJavascript標準に従ってラクダのケースにマップされるべきです。 Python開発者は、これが価値ある努力だとは考えていませんが、それは公正な点がありますが、慣習に従わないのは間違いです。Redux状態を更新する前にサーバーからのJSON応答を正規化

これはどのように処理する必要がありますか?

+1

サーバーレスポンスを処理する方法によって異なりますが、一般的な方法はミドルウェアと[humps](https://www.npmjs.com/package/humps)のようなものを使用することです。 –

答えて

3

私が通常持っているのは、すべてのフェッチ要求を処理するミドルウェアです。そこでは、応答をインターセプトし、ハンプを使用してキーを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 }, 
    }, 
}); 

私は通常のフェッチを処理するためのユーティリティを持っているが、これはあなたにどのように上のアイデアを与えるだろうキャメルケース変換を扱う。

1

特別なパーサーやレンダラーがラクダケースとスネークケースの間を行き来するように思えます。 Django Rest Frameworkを使用している場合は、JSONRendererを使用して、CamelCaseJSONRendererなどの新しいサブクラスを作成して、自動的に前後に切り替えることができます。あなたはその後、カスタマイズされた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 

がベースで、あなたはこのようになります機能を実装することをお勧めします。そうすれば、すべてのpythonオブジェクトがjavascriptの背中とcamelcaseにsnakecaseとなります。

関連する問題