HTTP-запросы присваивают несколько значений ключу в параметрах

#python #json #http #python-requests

#питон #json #http #python-запросы

Вопрос:

Я использую библиотеку запросов python для выполнения ‘GET’ из API. вот часть моего кода :

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

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

Согласно документации API, мы можем назначить несколько идентификаторов темы одному запросу следующим образом: <url>topicId=123amp;topicId=246

когда я пытаюсь установить значение topicIds в виде списка, подобного этому:

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

Я получаю сообщение об ошибке : {u'error': u'topicIds: has 2 terms, should be between 0 and 1'}

Однако, когда я запускаю код, я получаю данные только из последних topicIds => ‘topicIds’: ‘242793’ Я неправильно записываю словарь полезной нагрузки?

Спасибо,

Комментарии:

1. Есть ли причина, по которой вы не создаете список идентификаторов тем?

2. да, это не сработало (см. Правки)

Ответ №1:

Попробуйте:

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

Это наиболее распространенный способ определения массивов в строках запроса.

Комментарии:

1. как это вписывается в переменную полезной нагрузки?

2. Это была просто ошибка с моей стороны при копировании моего тестового кода. Сейчас я его отредактировал. Следует обратить внимание на скобки после идентификаторов тем. Стоит попробовать, и мы действительно больше не можем помочь, не зная спецификации API.

3. @fasouto отредактировал мой ответ по какой-то странной причине вообще без тестирования, поэтому я откатил его. Результирующий URL-адрес НЕ совпадает со скобками и без скобок. Использование скобок приводит к example.com/?topicIds[]=128487amp;topicIds[]=242793 — Безрезультатно в example.com/?topicIds=128487amp;topicIds=242793 — Скобки — это наиболее распространенный способ определения массивов в параметрах запроса и публикации (например, PHP анализирует GET params как массивы с таким синтаксисом).

4. @scandinavian_ Я тестировал, и у меня это не сработало, поэтому я отредактировал его. Я видел topicIds=[1,2] и topicIds=1amp;topicIds= 2, но никогда не видел topicIds[]= [1,2], так что я думаю, что это была опечатка. Я не знаю, как лучше поступить, и у меня сейчас нет времени на расследование, поэтому приношу извинения за причиненные неудобства

Ответ №2:

Это тоже сработало бы

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

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

Ответ №3:

Да, вы неправильно записываете полезную нагрузку, просто попробуйте напечатать этот dict, вы получите

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

Ключи переопределяются в словаре

Я думаю, что было бы лучше сделать одну строку из всех topicIds, что-то вроде этого

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