Comment appeler une api depuis une autre api dans fastapi ?

Aug 19 2020

J'ai pu obtenir la réponse d'une API d'une autre mais je n'ai pas pu la stocker quelque part (dans un fichier ou quelque chose avant de renvoyer la réponse) response=RedirectResponse(url="/apiname/")(je veux accéder à une demande de publication avec en-tête et corps)

Je veux stocker ce contenu de réponse sans le retourner.

Oui, si je renvoie la fonction, j'obtiendrai les résultats, mais lorsque je l'imprime, je ne trouve pas de résultats. De plus, si je donne une demande de publication, j'obtiens une erreur Entité introuvable.

J'ai lu les docs starlette et fastapi mais je n'ai pas trouvé la solution de contournement. Les rappels n'ont pas non plus aidé.

Réponses

1 SudipKandel Aug 20 2020 at 14:59

Je n'ai pas exactement trouvé le moyen de stocker la réponse sans revenir directement à l'aide de fastapi/starlette . Mais j'ai trouvé une solution de contournement pour terminer cette tâche.

  • Pour les personnes essayant de mettre en œuvre la même chose, veuillez considérer cette façon.
import requests

def test_function(request: Request, path_parameter: path_param):

    request_example = {"test" : "in"}
    host = request.client.host
    data_source_id = path_parameter.id

    get_test_url= f"http://{host}/test/{id}/"
    get_inp_url = f"http://{host}/test/{id}/inp"

    test_get_response = requests.get(get_test_url)
    inp_post_response = requests.post(get_inp_url , json=request_example)
    if inp_post_response .status_code == 200:
        print(json.loads(test_get_response.content.decode('utf-8')))

S'il vous plaît laissez-moi savoir s'il existe de meilleures approches.

TD Jan 28 2021 at 23:44

J'ai le même problème et j'avais besoin d'appeler l'API tierce de manière asynchrone . J'ai donc essayé de nombreuses façons et j'ai trouvé une solution avec la bibliothèque requests-async et cela fonctionne pour moi.

import http3

client = http3.AsyncClient()

async def call_api(url: str):

    r = await client.get(url)
    return r.text

@app.get("/")
async def root():
    ...
    result_1 = await call_api('url_1')
    result_2 = await call_api('url_2')
    ...

httpx vous pouvez également utiliser cette vidéo , il utilise httpx