Como chamar uma API de outra API no fastapi?

Aug 19 2020

Consegui obter a resposta de uma API de outra, mas não consegui armazená-la em algum lugar (em um arquivo ou algo assim antes de retornar a resposta) response=RedirectResponse(url="/apiname/")(desejo acessar uma solicitação de postagem com cabeçalho e corpo)

Desejo armazenar este conteúdo de resposta sem devolvê-lo.

Sim, se eu retornar a função obterei os resultados, mas quando a imprimo, não encontro resultados. Além disso, se eu der uma solicitação de postagem, recebo o erro Entidade não encontrada.

Eu li os documentos starlette e fastapi, mas não consegui obter a solução alternativa. Os retornos de chamada também não ajudaram.

Respostas

1 SudipKandel Aug 20 2020 at 14:59

Não entendi exatamente como armazenar a resposta sem retornar usando fastapi/starlette diretamente. Mas encontrei uma solução alternativa para concluir esta tarefa.

  • Para as pessoas que estão tentando implementar a mesma coisa, considere este caminho.
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')))

Por favor, deixe-me saber se existem abordagens melhores.

TD Jan 28 2021 at 23:44

Eu tenho o mesmo problema e precisava chamar a API de terceiros de maneira assíncrona . Então, tentei de várias maneiras e encontrei a solução com a biblioteca request-async e funcionou para mim.

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 também você pode usar este vídeo ele está usando httpx