цикл для передачи массовых значений в запрос api python

#python #python-3.x #api #loops

Вопрос:

У меня есть API, встроенный в Python, который выводит данные и принимает входной параметр «ID», а также выводит набор полей. Параметр не позволяет передавать массовые значения, и чтобы обойти это, я попытался создать цикл для выполнения одного вызова на идентификатор. Ниже приведен пример того, что я пробовал:

     ID = '19727795,19485344'
#15341668,
fields = 'userID, agentID, internalID'
 
#add all necessary headers
header_param = {'Authorization': 'bearer '   accessToken,'content-Type': 'application/x-www-form-urlencoded','Accept': 'application/json, text/javascript, */*'}

for x in ID:
    response = requests.get(Baseuri   '/services/v17.0/agents/'   x   '?fields='   fields , headers = header_param) 
 
 

Даже этот цикл возвращает ошибку «404 Неверный идентификатор»

Как можно передать список аргументов в параметр ID? Я должен запускать этот код не реже одного раза в день, и мне нужен способ передачи нескольких значений.

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

1. Ну, прямо сейчас ID это строка, и повторение по строке просто возвращает отдельные символы. Либо делай ID = ['first_id', 'second_id', ...] , либо делай for x in ID.split(',')

2. @Лагербер, использующий ID = [‘first_id’, ‘second_id’], не работает, так как показывает ошибку типа: может только объединить str (не «список») в str. Использование для x в ID.split(‘,’) означает только возврат последнего переданного идентификатора

Ответ №1:

Если он не разрешает массовые идентификаторы и это ваш API, у вас есть два варианта, которые я вижу. Вы либо А) разрешаете это на стороне сервера, либо Б) делаете это:

 fields = 'userID, agentID, internalID'
field_list = fields.split(",")

for field in field_list:
    pass
 

На самом деле все сводится к тому, хотите ли вы, чтобы ваш клиентский код был более простым, или чтобы ваш серверный код был более простым, потому что это более или менее один и тот же процесс, независимо от того, в каком конце он находится. С другой стороны, f-строки более эффективны и чище (субъективны) в использовании:

 response = requests.get(Baseuri   '/services/v17.0/agents/'   x   '?fields='   fields , headers = header_param)
 

превратится в:

 response = requests.get(f'{BASE_URI}/services/v17.0/agents/{x}?fields={fields}', headers = header_param)  
 

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

1. разве не должно быть разделено поле идентификатора? Какова цель разделения списка полей?

2. в чем же на самом деле разница? Все, что вам нужно сделать, это соответствующим образом изменить значения, и обе строки будут иметь один и тот же формат.

3. дело в том, что вы используете строковый метод .split()

4. Вышесказанное работает, с одной поправкой — дикт. вывод из ответа должен быть добавлен в один дикт, так как цикл for перезаписывает предыдущее значение