Как я могу передать список различных параметров запроса в тело запроса соответственно?

#python #api #python-requests

Вопрос:

У меня есть список параметров запроса, которые я хочу передать функции в качестве параметра. Эта функция вызывает api, поэтому каждый элемент в этом списке параметров передается соответственно для каждого вызова и извлекает результаты, связанные с этим параметром, пока он не достигнет конца этого списка.

Вот список параметров(каждый элемент в этом списке имеет разный диапазон дат с разным набором результатов).:

 REQUEST_PARAMS = [
    {
        "period": "range",
        "date": "2020-10-08,2020-10-31",
        "format": "JSON",
        "module": "API",
        "method": "**",
        "flat": "1",
        "filter_limit": "-1",
    },
    {
        "period": "range",
        "date": "2020-11-01,2020-11-30",
        "format": "JSON",
        "module": "API",
        "method": "**",
        "flat": "1",
        "filter_limit": "-1",
    },
    {
        "period": "range",
        "date": "2020-12-01,2020-12-31",
        "format": "JSON",
        "module": "API",
        "method": "**",
        "flat": "1",
        "filter_limit": "-1",
    }
]
 

Вот функция, которая вызывает целевой api:

  def get_the_results(max_retries=4):
        """
        Fetch the response object from the api
        :param max_retries: The max number of retries in case of error.
        :return: list of dictionaries for the results
        """
        return fetch_and_validate_response(URL, REQUEST_PARAMS, max_retries)


def fetch_and_validate_response(url, params, max_retries=0):
"""
Fetch a response object from provided URL.
:param url: The url for the request
:param params: The parameters for the request
:param max_retries: The max number of retries in case of error.
:return: json object if successful, None if retries due to network error continues to fail
"""
try:
    response = get(url=url, params=params, verify=False)
    response.raise_for_status()
    response_decoded = response.json()
    # Raise a RequestException if the API returns a result with an error.
    try:
        if response_decoded.get('result') == 'error':
            log.info(f"Error in response: {response_decoded.get('result')} - {response_decoded.get('message')}")
            raise RequestException
    except AttributeError:
        log.info("No error detected in response object.")

    return response_decoded
except HTTPError as e:
    log.exception(f'Network Error: HTTP error {response.status_code} occurred while getting query: {url}: {e}')
except ConnectionError as e:
    log.exception(f'Network Error: A connection error occurred while getting query: {url} with {params}: {e}')
except Timeout as e:
    log.exception(f'Network Error: The request timed out for query: {url} with {params}: {e}')
except RequestException as e:
    log.exception(f'Network Error: An error occurred while getting {url}. Please double-check the url: {e}')

if max_retries <= 0:
    return None

time.sleep(5)

return fetch_and_validate_response(url, params, max_retries - 1)
 

Я хочу распечатать результаты, полученные в результате этого вызова в этой функции:

 def construct_results_dict():
    data = get_the_results()
    for item in data:
        print(item)
 

мы очень ценим вашу помощь — Спасибо 🙂

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

1. Зацикливайтесь на REQUEST_PARAMS них и передавайте их своей функции.

2. @Ram Я попробовал это решение, оно выбирает только первый элемент и возвращает свой собственный результат, после чего вызов завершен!

3. Это происходит потому, что вы используете return в своей функции, и поэтому функция останавливается после первого вызова. Не могли бы вы опубликовать свой полный код?

Ответ №1:

Вы могли бы сделать что-то подобное.

Выполните итерацию по REQUEST_PARAMS списку и вызовите fetch_and_validate_response() каждый параметр, а затем сохраните возвращаемые значения fetch_and_validate_response() в списке и верните этот список.

 def get_the_results(max_retries=4):
        """
        Fetch the response object from the api
        :param max_retries: The max number of retries in case of error.
        :return: list of dictionaries for the results
        """
        # results list to store the results returned by the below function
        results = []
        for param in REQUEST_PARAMS:
            results.append(fetch_and_validate_response(URL, param, max_retries)) 
        
        # Finally return the results list
        return results
 

И теперь results список будет возвращен data в приведенной ниже функции.

 def construct_results_dict():
    data = get_the_results()
    for item in data:
        print(item)