Как размещать дикты со списками, используя запросы в Python? - PullRequest
0 голосов
/ 29 мая 2020

Мне нужно отправить вложенный запрос. Вот пример dict:

data = {
        "customer_id": "customer_1",
        "time": get_timestamp(),
        "data_1": ["1", "2"],
        "data_2": ["6", "7"],
    }

В списках может быть большее количество элементов и больше списков, это всего лишь пример. При отправке r = requests.post(url, data=data) или r = requests.post(url, json=data) или r = requests.post(url, data=json.dumps(data))

я получаю сообщение о том, что обязательных полей нет, и я проверил, что данные не были отправлены. Однако, если я отправлю его таким образом, он работает:

data = {
        "customer_id": "customer_1",
        "time": get_timestamp(),
        "data_1[0]": "1",
        "data_1[1]": "2",
        "data_2[0]": "6",
        "data_2[1]": "7"
    }

Есть ли способ отправлять списки с помощью запросов без необходимости помещать каждый элемент как отдельный ключ?

Редактировать . Я забыл упомянуть, что мне тоже нужно отправлять файлы вместе. Сначала я не думал, что файлы могут быть проблемой, но они, конечно, могут (я хотел максимально упростить вопрос). Я добавляю файлы: files = {"files": open(path_to_file, "rb")} и отправляю добавление files=files в запрос POST. Таким образом, весь код будет выглядеть так:

url = ""
token = "token"
headers = {"Authorization": "Bearer " + token}
data = {
    "customer_id": "customer_1",
    "time": get_timestamp(),
    "data_1": ["1", "2"],
    "data_2": ["6", "7"],
}
path_to_file = "file.jpg"
files = {"files": open(path_to_file, "rb")}
r = requests.post(url, data=data, files=files, headers=headers, verify=False)

У меня есть спецификация почтальона для этого: enter image description here

1 Ответ

0 голосов
/ 02 июня 2020

Если ваш сервер требует, чтобы вы включали значения в список как отдельные элементы с индексом (например, "data_1[0]": "1" и "data_1[1]": "2" вместо "data_1":["1", "2"]), тогда никто здесь не может сказать вам ничего, что изменило бы это. На самом ли деле это правда, никто здесь не может проверить, если вы не поделитесь дополнительной информацией о сервере или протоколе.

Конечно, довольно легко сопоставить структуру данных, которую вы хотите, со структурой данных, которая нужна серверу:

def get_what_you_need(data, unpack_lists):
    result = dict(data)
    for unpack_list in unpack_lists:
        assert unpack_list in data
        for key, value in enumerate(data[unpack_list]):
            result[f'{unpack_list}[{key}]'] = value
        del result[unpack_list]
    return result


you_like = {
    "customer_id": "customer_1",
    "time": get_timestamp(),
    "data_1": ["1", "2"],
    "data_2": ["6", "7"],
}

you_need = get_what_you_need(you_like, ['data_1', 'data_2'])
print(you_need)

Что касается файлов, похоже, у вас нет вопрос там, и он не имеет никакого отношения к вышесказанному.

...