The Dan
The Dan

Reputation: 1690

Pythonic way to add optional parameters to API request

I'am trying to make an API request where I add some optional values but if I don't add them I don't want them to be in the request.

In this case, I would like the parameters to be 'startblock' & 'endblock'

def get_transactions_by_address_(self, address, action='txlist'):
    """

    :param address:
    :param action: [txlist, txlistinternal]

    :return:
    """
    token = self.etherscan_api_key
    return requests.get('https://api.etherscan.io/api'
                        '?module=account'
                        f'&action={action}'
                        f'&address={address}'
                        # '&startblock=0'
                        # '&endblock=92702578'
                        '&page=1'
                        '&offset=1000'
                        '&sort=desc'
                        f'&apikey={token}'
                        )

I was thinking on adding some conditionals like

request_url = 'https://api.etherscan.io/api...'
if startblock:
    request_url = request_url + f'&startblock={startblock}'
if endblock:
    request_url = request_url + f'&endblock={endblock}'

But I don't know if it is the most pythonic way to do it and I would like to get other options on how to do it

Upvotes: 1

Views: 2743

Answers (2)

chepner
chepner

Reputation: 532013

Use the payload option instead of constructing the URL yourself. For example, create a dict containing all the required options, then add additional parameters to the dict as necessary. requests.get will build the required URL from the base URL and the values found in your dict.

options = {
        'module': 'account',
        'action': action,
        'address': address,
        'apikey': token,
        'sort': sort,
        'page': page,
        'offset': offset
    }
if startblock:
    options['startblock'] = startblock
if endblock:
    options['endblock'] = endblock

return requests.get('https://api.etherscan.io/api', params=options)

Upvotes: 3

The Dan
The Dan

Reputation: 1690

The correct way to implement is:

def get_transactions_by_address_(self, address,
                                 action='txlist',
                                 sort='desc',
                                 page=1,
                                 offset=1000,
                                 startblock=None,
                                 endblock=None):
    
    token = self.etherscan_api_key
    options = {
        'module': 'account',
        'action': action,
        'address': address,
        'apikey': token,
        'sort': sort,
        'page': page,
        'offset': offset
    }
    if startblock:
        options['startblock'] = startblock
    if endblock:
        options['endblock'] = endblock

    return requests.get('https://api.etherscan.io/api',
                        params=options
                        )

Upvotes: 0

Related Questions