Python请求dict作为表单数据

时间:2017-06-08 13:04:09

标签: python python-requests

我有一个python dict

x = {'id': 123, 'data': {'param1': 'hello', 'param2': 'world'}}

我试图让我的表单数据

id=123
data[param1]=hello
data[param2]=world

无法将其作为json传递,因为接收它的API不会接受json对象

我试过像这样传递它

requests​.post(url, data=x, headers={'content-type': 'application/x-www-form-urlencoded'})

请求结果显示表格数据,如下所示

id=123
data=param1
data=param2

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:0)

您应该发布data = x,而不是发布data=x['data']。这应该可以解决您的问题。

requests​.post(url, data=x['data'], headers={'content-type': 'application/x-www-form-urlencoded'})

或者更好的方法是从你的dict中删除data键并直接创建dict为

x = {'param1': 'hello', 'param2': 'world'}

然后你可以张贴:

requests​.post(url, data=x['data'], headers={'content-type': 'application/x-www-form-urlencoded'})

选择最适合你的方式..

希望这会有所帮助:)

答案 1 :(得分:-1)

你可以展平第一级:

x = {'data': {'param1': 'hello', 'param2': 'world'}}

x_flattened = {"{}[{}]".format(e, s) if type(: x[e][s] for e in x for s in x[e]}

requests​.post(url, data=x_flattened)

修改 - 您在此期间为原始对象添加了更多信息。如果你想保留顶级奇异参数,你可以分两步完成(你可以在单个dict理解中做到这一点,但很快就会变得难看):

x_flattened = {}
for e in x:
    if isinstance(x[e], (list, dict)):
        x_flattened.update({"{}[{}]".format(e, s): x[e][s] for s in x[e]})
    else:
        x_flattened[e] = x[e]

requests​.post(url, data=x_flattened)

答案 2 :(得分:-1)

也许你可以做得很好。我们来试试吧

x = {
   'id': 123,
   'data[param1]': 'hello',
   'data[param2]': 'world',
}

https://github.com/requests/requests/issues/2885