Кодировать URL с помощью вложенных словарей - PullRequest
0 голосов
/ 27 сентября 2018

Я использую API, который не принимает JSON в теле запросов.Он использует x-www-form-urlencoded.

Таким образом, если я должен отправить это dict:

{
    'a': 1,
    'b': 2,
    'c': {
        'k': 3,
        'v': 4,
        'l': {
            'p': 5,
            'q': 6,
        },
    },
}

Это должно быть закодировано следующим образом:

a=1
b=2
c[k]=3
c[v]=4
c[l][p]=5
c[l][q]=6

Однако urllib.parse.urlencode не будет анализировать dict таким образом.Вместо этого он собирается буквально кодировать c контент и помещать его в него (c={encodeddict}).

Я пытался самостоятельно реализовать такой кодер, но не смог разобраться с несколькими вложенными dicts.Мне удалось закодировать только 1-й уровень dicts (например, c[k]=3), но не рекурсивно до последнего уровня (например, c[l][p]=5).

Каков наилучший способ достижения этого видакодировка в Python 3?

1 Ответ

0 голосов
/ 27 сентября 2018

Что-то, что я реализовал сам, используя рекурсию.

передайте ваш dict в dict_to_urlencoded (), и он вернет закодированную строку формата на основе вашего описания.(не отсортировано)

def dict_to_urlencoded(d):
    return kv_translation(d, "", "")


def kv_translation(d, line, final_str):
    for key in d:
        key_str = key if not line else "[{}]".format(key)
        if type(d[key]) is not dict:
            final_str = "{}{}{}={}\n".format(final_str, line, key_str, d[key])
        else:
            final_str = kv_translation(d[key], line + key_str, final_str)
    return final_str
...