Подтвердить что ты не робот

Как отправить массив с помощью request.post(Python)? "Ошибка значения: слишком много значений для распаковки"

Я пытаюсь отправить массив (список) запросов в API-интерфейс WheniWork с помощью request.post, и я продолжаю получать одну из двух ошибок. Когда я отправляю список в виде списка, у меня появляется ошибка распаковки, и когда я отправляю его как строку, у меня возникает ошибка с просьбой отправить массив. Я думаю, что это имеет какое-то отношение к тому, как запросы обрабатывают списки. Вот примеры:

url='https://api.wheniwork.com/2/batch'
headers={"W-Token": "Ilovemyboss"}
data=[{'url': '/rest/shifts', 'params': {'user_id': 0,'other_stuff':'value'}, 'method':'post',{'url': '/rest/shifts', 'params': {'user_id': 1,'other_stuff':'value'}, 'method':'post'}]
r = requests.post(url, headers=headers,data=data)
print r.text

# ValueError: too many values to unpack

Просто обертывание значения для данных в кавычках:

url='https://api.wheniwork.com/2/batch'
headers={"W-Token": "Ilovemyboss"}
data="[]" #removed the data here to emphasize that the only change is the quotes
r = requests.post(url, headers=headers,data=data)
print r.text

#{"error":"Please include an array of requests to make.","code":5000}
4b9b3361

Ответ 1

Вы хотите передать JSON-кодированные данные. См. Документацию API:

Помните - все почтовые тела должны быть закодированными JSON данными (без данных формы).

Библиотека requests делает это тривиально простым:

headers = {"W-Token": "Ilovemyboss"}
data = [
    {
        'url': '/rest/shifts',
        'params': {'user_id': 0, 'other_stuff': 'value'},
        'method': 'post',
    },
    {
        'url': '/rest/shifts',
        'params': {'user_id': 1,'other_stuff': 'value'},
        'method':'post',
    },
]
requests.post(url, json=data, headers=headers)

Используя аргумент ключевого слова json, данные кодируются для JSON для вас, а заголовок Content-Type имеет значение application/json.

Ответ 2

Ну, Оказывается, все, что мне нужно было сделать, это добавить эти заголовки:

headers = {'Content-Type': 'application/json', 'Accept':'application/json'}

и чем запросы на вызов

requests.post(url,data=json.dumps(payload), headers=headers)

и теперь я хорош!