Вызовите API для каждого элемента в списке - PullRequest
0 голосов
/ 10 октября 2019

У меня есть список с более чем 1000 идентификаторами, и я хочу вызвать API с разными конечными точками для каждого элемента списка. Пример:

customerlist = [803818, 803808, 803803,803738,803730]

Я попробовал следующее:

import json
import requests
import pandas as pd



API_BASEURL = "https://exampleurl.com/"
API_TOKEN = "abc"
HEADERS = {'content-type' : 'application/json',
           'Authorization': API_TOKEN }


def get_data(endpoint):
    for i in customerlist:
        api_endpoint = endpoint
        params = {'customerid' : i}
        response = requests.get(f"{API_BASEURL}/{api_endpoint}",
                             params = params,
                             headers = HEADERS)
        if response.status_code == 200:
            res = json.loads(response.text)
        else:
            raise Exception(f'API error with status code {response.status_code}')
        res= pd.DataFrame([res])
        return res

get_data(endpointexample)

Это работает, но возвращает только значения для первого элемента списка (803818). Я хочу, чтобы функция возвращала значения для каждого идентификатора из списка клиентов для конечной точки, которую я определил в аргументе функции.

Я нашел этот - возможно связанный - вопрос, но я не мог понятьмоя проблема решена.

Вероятно, есть простое решение для этого, которого я не вижу, так как я только начинаю с Python. Спасибо.

1 Ответ

4 голосов
/ 10 октября 2019

В тот момент, когда функция выполняет оператор return, она немедленно завершается. Поскольку ваш оператор return находится в цикле, другие итерации фактически никогда не вызываются.

Чтобы исправить, вы можете создать list вне цикла, добавлять к нему каждую итерацию цикла, а затем возвращатьDataFrame, созданный с этим списком:

def get_data(endpoint):
    responses = []
    for i in customerlist:
        api_endpoint = endpoint
        params = {'customerid' : i}
        response = requests.get(f"{API_BASEURL}/{api_endpoint}",
                             params = params,
                             headers = HEADERS)
        if response.status_code == 200:
            res = json.loads(response.text)
        else:
            raise Exception(f'API error with status code {response.status_code}')
        responses.append(res)
    return pd.DataFrame(responses)

Гораздо более чистое решение - использовать понимание списка:

def get_data(endpoint, i):
    api_endpoint = endpoint
    params = {'customerid' : i}
    response = requests.get(f"{API_BASEURL}/{api_endpoint}",
                         params = params,
                         headers = HEADERS)
    if response.status_code == 200:
        res = json.loads(response.text)
    else:
        raise Exception(f'API error with status code {response.status_code}')

    return res

responses = pd.DataFrame([get_data(endpoint, i) for i in customerlist])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...