Wie rufe ich eine API von einer anderen API in Fastapi auf?
Ich konnte die Antwort einer API von einer anderen abrufen, konnte sie aber nicht irgendwo speichern (in einer Datei oder so, bevor ich die Antwort zurückgab) response=RedirectResponse(url="/apiname/")(ich möchte auf eine Post-Anfrage mit Header und Body zugreifen)
Ich möchte diesen Antwortinhalt speichern, ohne ihn zurückzugeben.
Ja, wenn ich die Funktion zurückgebe, bekomme ich die Ergebnisse, aber wenn ich sie drucke, finde ich keine Ergebnisse. Wenn ich eine Post-Anfrage gebe, erhalte ich außerdem den Fehler Entity not found.
Ich habe die Starlette- und Fastapi-Dokumentation gelesen, konnte aber die Problemumgehung nicht finden. Auch die Rückrufe halfen nicht.
Antworten
Ich habe nicht genau den Weg gefunden, die Antwort zu speichern, ohne direkt mit fastapi/starlette zurückzukehren . Aber ich habe eine Problemumgehung gefunden, um diese Aufgabe abzuschließen.
- Für die Leute, die versuchen, dasselbe zu implementieren, ziehen Sie bitte diesen Weg in Betracht.
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')))
Bitte lassen Sie mich wissen, ob es bessere Ansätze gibt.
Ich habe das gleiche Problem und ich musste die Drittanbieter-API auf asynchrone Weise aufrufen. Also habe ich viele Möglichkeiten ausprobiert und ich habe eine Lösung mit der Requests-Async- Bibliothek gefunden , und es funktioniert für mich.
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 Sie können auch dieses Video verwenden, das er mit httpx verwendet