如何使用requests.post(Python)发送数组&引用;值错误:值太多,无法解压缩";

如何使用requests.post(Python)发送数组&引用;值错误:值太多,无法解压缩";,python,api,python-requests,Python,Api,Python Requests,我试图使用requests.post将请求数组(列表)发送到WheniWork API,我一直收到两个错误中的一个。当我以列表的形式发送列表时,会出现解包错误,而当我以字符串的形式发送列表时,会出现要求我提交数组的错误。我认为这与请求如何处理列表有关。以下是一些例子: url='https://api.wheniwork.com/2/batch' headers={"W-Token": "Ilovemyboss"} data=[{'url': '/rest/shifts', 'params':

我试图使用requests.post将请求数组(列表)发送到WheniWork API,我一直收到两个错误中的一个。当我以列表的形式发送列表时,会出现解包错误,而当我以字符串的形式发送列表时,会出现要求我提交数组的错误。我认为这与请求如何处理列表有关。以下是一些例子:

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}

事实证明,我所需要做的就是添加以下标题:

headers = {'Content-Type': 'application/json', 'Accept':'application/json'}
然后打电话请求

requests.post(url,data=json.dumps(payload), headers=headers)
现在我好了

您希望传入JSON编码的数据。见:

请记住-所有帖子正文都必须是JSON编码的数据(没有表单数据)

请求
库使这变得非常简单:

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,并将
内容类型
标题设置为
应用程序/json

HTTP POST请求中发送数组(列表)或字典时,请务必记住,在post函数中使用json参数,并将其值设置为数组(列表)/字典

在您的情况下,它将类似于:

r=requests.post(url,headers=headers,json=data)

注意:POST请求将body的参数内容类型隐式转换为application/json


快速介绍一下

我有一个类似的案例,但完全不同的解决方案, 我复制了一段代码,看起来是这样的:

    resp_status, resp_data = requests.post(url, headers=headers, 
                                                json=payload,  verify=False) 
这导致了错误:

ValueError: too many values to unpack (expected 2)
只需指定一个变量即可解决此问题:

            response = requests.post(url, headers=headers, 
                                              json=payload,  verify=False)

与data=json.dumps(有效负载)相比,造成的麻烦更少。谢谢你的解决方案,谢谢!现在我将永远记住在POST请求中发送列表或字典时使用JSON参数!