[Python] How to implement REST API call to Azure Functions?

Discussão em 'Python' iniciado por Stack, Novembro 20, 2024.

  1. Stack

    Stack Membro Participativo

    I am trying to create an Azure Function that runs every time a list of users is updated on a third-party REST API. This is how my code looks on its own, and works as expected (returns the result I'm looking for):

    import base64
    import requests
    from urllib.parse import urlencode
    import os


    username = os.environ["username"]
    password = os.environ["password"]

    encoded_username = urlencode({"username": username}).split('=')[1]
    encoded_password = urlencode({"password": password}).split('=')[1]

    # Combine username and password into a single string
    url_cred = f"{encoded_username}:{encoded_password}"

    # Encode the combined string in Base64
    encoded_b64 = base64.b64encode(url_cred.encode('utf-8')).decode('utf-8')

    # Set up headers for the POST request
    headers = {
    "authorization": f"Basic {encoded_b64}"
    }

    # Set up body for the POST request
    body = {
    "grant_type": "client_credentials"
    }

    # Obtain access token with GET request
    response = requests.post("https://examplewebsite.com/oauth2/token", headers=headers, data=body)
    token = response.json().get('access_token')

    # Set up headers for the GET request with the access token
    auth_header = {
    "authorization": f"Bearer {token}"
    }

    # Make the GET request to retrieve users
    response = requests.get("https://examplewebsite.com", headers=auth_header)
    # ! This is the GET request I want to use to trigger the function !
    results = response.json()

    username_results = []
    for data in results:
    for elem in results["usersResult"]:
    username_results.append(elem['userName'])


    for name in username_results:
    print(name)


    Here is my attempt at integrating the code into an Azure Function:

    import azure.functions as func
    import logging
    import json
    import requests
    import base64
    from urllib.parse import urlencode
    import os


    app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)

    username = os.environ["username"]
    password = os.environ["password"]


    @app.route(route="api_call")
    def api_call(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    # URL encode username and password
    encoded_username = urlencode({"username": username}).split("=")[1]
    encoded_password = urlencode({"password": password}).split("=")[1]

    url_cred = f"{encoded_username}:{encoded_password}"

    # Encode in Base64
    encoded_64 = base64.b64encode(url_cred.encode("utf-8")).decode("utf-8")

    # Headers for POST request
    headers = {
    "authorization": f"Basic {encoded_64}"
    }

    # Body for POST request
    body = {
    "grant_type": "client_credentials"
    }

    # Obtain access token with GET request
    response = requests.post("https://examplewebsite.com/oauth2/token", headers=headers, data=body)
    token = response.json().get("access_token")

    # Headers for GET request with access token
    auth_header = {
    "authorization": f"Bearer {token}"
    }

    # Make GET request to retrieve users
    res = requests.get("https://examplewebsite.com", headers=auth_header)

    # ! The GET request I want to use to trigger the function !
    results = req.get_json(res)


    # Filter results and return only usernames
    username_results = []
    for data in results:
    for elem in results["usersResult"]:
    username_results.append(elem["userName"])

    for name in username_results:
    return func.HttpResponse(json.dumps(name))



    With this code, I get the error System.Private.CoreLib: Result: Failure Exception: TypeError: HttpRequest.get_json() takes 1 positional argument but 2 were given

    How do I connect the HTTP trigger correctly?

    I have read the documentations on Azure Function HTTP triggers and bindings but can't find any good examples to help.

    Continue reading...

Compartilhe esta Página