如何在Python Requests GET请求中发送列表

17

我正在尝试从服务器获取一些数据。我正在使用Python requests库进行GET请求:

my_list = #a list ['x', 'y', 'z']
payload = {'id_list': my_list}
requests.get(url, params=payload)

我的服务器接收一个URL: https://url.com/download?id_list

但是当我发送这个GET请求时,我得到了一个错误:

<h1>400 Bad Request</h1> 由于格式不正确,服务器无法理解该请求。 <br /><br /> 得到一个参数的多个值:<br /> <pre>id_list</pre>

我查看了日志,请求看起来像这样:

url/download?id_list=x&id_list=y&id_list=z

我该如何修复它?


将其作为 JSON 发送:requests.get(url, json=payload) - Bob Dylan
@BobDylan 我会试试看的 :) - Abdul Ahmad
@BobDylan,那个不起作用。我得到了另一个错误“找不到参数id_list”。 - Abdul Ahmad
2个回答

16

实际上没有什么需要修复的,问题在于服务器端!requests 默认处理列表的方式就是应该处理的方式。

但你真正应该问的问题是,服务器端的API期望什么?

一旦你知道了这一点,就可以使用 requests 模拟它。

例如,很可能服务器期望 id_list 参数作为一个 json 字符串。那么你可以这样做:

payload = {'id_list': json.dumps(my_list)}

但是服务器端可能期望一个由逗号分隔的列表:

payload = {'id_list': ','.join(my_list)}

那么,你需要阅读与你尝试通信的API相关的文档(或者在其中摸索)。


注:正如@bob_dylan建议的那样,你可以尝试使用requests.get(url, json=payload),但据我所知,JSON有效载荷通常用于POST请求,很少用于GET


谢谢,至少我可以将问题缩小到服务器! - Abdul Ahmad
问题可能出在服务器的框架上,它将GET参数编译成一个dict时,如果有多个相同的键,它可能不会构建一个列表,而是在添加新的(key, value)对时引发异常,因为在dict中已经存在具有该键的另一个值。但这只是猜测。 - zmo
问题出在传递值时使用了'params='而不是'payload='。这两个在Requests中是不同的函数。我遇到了同样的问题,使用params=传递列表也无法解决。将查询字符串列表分配给payload也没有帮助。 - 3lysium

5
用request.GET.getlist()来解决这个问题是一个不错的方法。
这个方法可以让你使用如下代码:
import requests
requests.get(url, data={'id_list': ['x', 'y', 'z']})

并在服务器上创建它:

request.GET.getlist('id_list')

如何准确返回所需内容:

>>> ['x', 'y', 'z']

当你只发送一个项时,它也会返回一个列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接