Python 为列表中的每个元素调用API

Python 为列表中的每个元素调用API,python,json,loops,Python,Json,Loops,我有一个超过1000个ID的列表,我想为列表中的每个元素调用一个具有不同端点的API。 例如: 我尝试了以下方法: import json import requests import pandas as pd API_BASEURL = "https://exampleurl.com/" API_TOKEN = "abc" HEADERS = {'content-type' : 'application/json', 'Authorization': API_TOK

我有一个超过1000个ID的列表,我想为列表中的每个元素调用一个具有不同端点的API。 例如:

我尝试了以下方法:

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的第一个元素的值。我希望函数从customerlist返回我在函数参数中定义的端点的每个ID的值

我发现了一个可能是相关的问题,但我无法解决我的问题


可能有一个简单的解决方案,我没有看到,因为我只是从Python开始。谢谢。

函数点击return语句时,立即完成。因为您的return语句在循环中,所以实际上不会调用其他迭代

要修复此问题,您可以在循环外部创建一个列表,在每次循环迭代后将其追加,然后返回使用该列表创建的数据帧:

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])

看起来你的缩进是错的。函数get_data末尾的Return语句位于for循环内部,它在第一个循环之后立即终止函数。将Return更改为yield
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])