Jak wywołać API z innego API w Fastapi?

Aug 19 2020

Udało mi się uzyskać odpowiedź jednego interfejsu API z innego, ale nie mogłem go gdzieś przechowywać (w pliku lub w czymś przed zwróceniem odpowiedzi) response=RedirectResponse(url="/apiname/")(chcę uzyskać dostęp do żądania wpisu z nagłówkiem i treścią)

Chcę przechowywać treść odpowiedzi bez jej zwracania.

Tak, jeśli zwrócę funkcję, otrzymam wyniki, ale kiedy ją wydrukuję, nie znajdę wyników. Ponadto, jeśli wyślę prośbę o wpis, otrzymam błąd Nie znaleziono jednostki.

Przeczytałem dokumentację Starlette i Fastapi, ale nie mogłem znaleźć obejścia. Oddzwaniania również nie pomogły.

Odpowiedzi

1 SudipKandel Aug 20 2020 at 14:59

Nie udało mi się dokładnie zapisać odpowiedzi bez powrotu bezpośrednio przy użyciu fastapi / starlette . Ale znalazłem obejście tego zadania.

  • Osoby, które próbują wdrożyć to samo, powinni rozważyć ten sposób.
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')))

Daj mi znać, jeśli są lepsze podejścia.

TD Jan 28 2021 at 23:44

Mam ten sam problem i musiałem wywołać interfejs API innej firmy w sposób asynchroniczny.Więc wypróbowałem wiele sposobów i otrzymałem rozwiązanie z biblioteką request-async i działa dla mnie.

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 również możesz użyć tego wideo, którego używa httpx