SeaDude
SeaDude

Reputation: 4365

How to pass a list of values, dynamically, as multiple Python requests parameters?

I'm new to Python. Trying to automate some painful API calls using the Python requests module. Getting pretty close, but can't figure out how to pass lists of timestamps as request parameters

Example: Generate list of lastModified timestamps

import datetime
from datetime import datetime, timedelta

earliest_ts_str = '2020-10-01T15:00:00Z'
earliest_ts_obj = datetime.strptime(earliest_ts_str, timestamp_format)

#bottom_ts_obj = earliest_ts_obj.replace(second=0, microsecond=0, minute=0)

latest_ts_str = '2020-10-01T23:00:00Z'
latest_ts_obj = datetime.strptime(latest_ts_str, timestamp_format)

ts_raw = []
while earliest_ts_obj < latest_ts_obj:
    ts_raw.append(earliest_ts_obj)
    earliest_ts_obj += timedelta(hours=1)

ts_raw.append(latest_ts_obj)

ts_formatted = [d.strftime('%Y-%m-%dT%H:%M:%SZ') for d in ts_raw]
ts_formatted

Results:

['2020-10-01T15:00:00Z',
 '2020-10-01T16:00:00Z',
 '2020-10-01T17:00:00Z',
 '2020-10-01T18:00:00Z',
 '2020-10-01T19:00:00Z',
 '2020-10-01T20:00:00Z',
 '2020-10-01T21:00:00Z',
 '2020-10-01T22:00:00Z',
 '2020-10-01T23:00:00Z']

Example 2: Create the request call

import requests

method = 'get'
base_url = 'https://sandbox-api.com/'
api_type = 'items'
api_version = '/v1/'
api_path = api_type + api_version

api_key = 'myKey'

full_url = base_url + api_path

def make_historic_calls(last_mod_start, last_mod_end):
    last_mod_start = for ts in ts_formatted: ts
    last_mod_end = for ts in ts_formatted: ts
    parameters = {'api_key':api_key, 'lastModifiedStart': last_mod_start, 'lastModifiedEnd': last_mod_end}

    auth_header = {'Authorization': 'Basic <base64EncodedStringHere>'}

    resp_raw = requests.request(method, full_url, headers=auth_header, params=parameters)

    resp_processed = json.loads(resp_raw.content)

    resp_pretty = json.dumps(resp_processed, indent=2, sort_keys=True)

    return print(pretty)

test = make_historic_calls(ts_formatted, ts_formatted)

I know this isn't an easy solve (its taken me days and days to get this far), but any guidance on how to tackle this would be appreciated.

Thank you

EDIT 1: This adjusted function works great!

def make_historic_calls(ts_formatted):
    for last_mod_start, last_mod_end in zip(ts_formatted, ts_formatted[1:]):
        parameters = {'api_key':api_key, 'lastModifiedStart': last_mod_start, 'lastModifiedEnd': last_mod_end}

        auth_header = {'Authorization': 'Basic <base64EncodedString>'}

        resp_raw = requests.request(method, full_url, headers=auth_header, params=parameters)

        print(f'{resp_raw.url} Status Code: {str(resp_raw.status_code)}')

    return print(resp_raw)

test = make_historic_calls(ts_formatted)

Upvotes: 0

Views: 1682

Answers (2)

Aleks J
Aleks J

Reputation: 283

So basically what you want to do is to chunk the list by 2 elements, and then unpack those 2 element lists and pass them to functions, consider something like the following generator:



def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

And then you can use it like the following:

for first, second in chunks(iterable, 2):
    make_historic_calls(first, second)

Hope this helps

Edit: I'm not sure if you want to pass the variables by pairs that overlap or don't, if you want them to overlap like (0,1) (1,2) (2,3)... instead of (0,1) (2,3) (4,5)... then use the version of "chunks" below:

def chunks(l, n, repeat=True):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        additional = int(repeat)
        yield l[i:i + n + additional]

Upvotes: 2

Frank Yellin
Frank Yellin

Reputation: 11230

The standard trick for extracting pairs of consecutive items from a list is:

for this_one, next_one in zip(my_list, my_list[1:]):
   ...

So your code needs to be something like:

def make_historic_calls(ts_formatted):
    for last_mod_start, last_mod_end in zip(ts_formatted, ts_formatted[1:]):
        make the request using last_mod_start and last_mod_end
    return some value combining all of the results from your requests


make_historic_calls(ts_formatted)

I hope I've understood correctly what it is you're trying to do.

Upvotes: 2

Related Questions