HTTP 请求为 params 中的键分配多个值

Posted

技术标签:

【中文标题】HTTP 请求为 params 中的键分配多个值【英文标题】:HTTP requests assign multiple values to a key in params 【发布时间】:2014-08-17 17:51:21 【问题描述】:

我正在使用 python 的请求库从 API 执行“GET”。这是我的代码的一部分:

payload =  'topicIds':'128487',
            'topicIds':'128485', 
        'topicIds': '242793',
            'timePeriod':'10d', 

r= requests.get(url, params=payload, headers=headers)

根据 API 文档,我们可以为一个请求分配多个 topicId,如下所示:<url>topicId=123&topicId=246

当我尝试将 topicIds 值设置为这样的列表时:

payload =  'topicIds':['128487' , '242793'],

我收到一个错误:u'error': u'topicIds: has 2 terms, should be between 0 and 1'

但是,当我运行代码时,我只从最后一个 topicIds => 'topicIds': '242793' 获取数据 我是不是写错了payload字典?

谢谢,

【问题讨论】:

您没有列出 topicIds 是否有原因? 是的,它不起作用(请参阅编辑) 【参考方案1】:

这样也行

params = 'topicIds': ['128487', '128485', '242793'],
         'timePeriod':'10d', 

r= requests.get(url, params=params)

【讨论】:

【参考方案2】:

试试:

payload = 'topicIds[]': ['128487', '242793']
r = requests.get(url, params=payload, headers=headers)

这是在查询字符串中定义数组的最常用方法。

【讨论】:

这如何适应有效载荷变量? 这只是我在复制粘贴测试代码时的一个错误。我现在已经编辑过了。需要注意的是 topicIds 后面的括号。值得一试,如果不了解 API 规范,我们真的无能为力。 @fasouto 出于某种奇怪的原因编辑了我的答案,根本没有进行测试,所以我把它回滚了。生成的 url 不带括号和不带括号是不一样的。带括号的结果是example.com/?topicIds%5B%5D=128487&topicIds%5B%5D=242793 - 没有结果的结果是example.com/?topicIds=128487&topicIds=242793 - 括号是在查询和发布参数中定义数组的最常用方法(例如,php 使用这种语法将 GET 参数解析为数组)。 @scandinavian_ 我测试过但它对我不起作用,这就是我编辑它的原因。我看到了 topicIds=[1,2] 和 topicIds=1&topicIds=2 但从来没有 topicIds[]=[1,2] 所以我坚持认为这是一个错字。我不知道最好的方法是什么,我现在没有时间调查,因此对给您带来的不便表示歉意【参考方案3】:

是的,你写错了payload,试着打印这个dict,你会得到

'topicIds': '242793', 'timePeriod': '10d'

字典中的键被覆盖

我认为最好从所有 topicId 中创建一个字符串,类似这样的

'<separator>'.join([<list of topicIds>])

【讨论】:

以上是关于HTTP 请求为 params 中的键分配多个值的主要内容,如果未能解决你的问题,请参考以下文章

如何向 qjsonobject 中的键添加多个值

将相同的键=>值对分配给PHP中的多个数组

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中

如何在chartjs数据集中为Object []使用x值中的日期,我收到一个错误:'TS2322:类型'字符串'不可分配给类型'数字'。

BigQuery:将数组中的键值对转换为列

在注册表中具有特定的键,可通过AppliesTo字符串值应用于多个条件