Как вызвать api из другого api в fastapi?

Aug 19 2020

Мне удалось получить ответ одного API от другого, но я не смог его где-нибудь сохранить (в файле или чем-то еще, прежде чем вернуть ответ) response=RedirectResponse(url="/apiname/")(я хочу получить доступ к почтовому запросу с заголовком и телом)

Я хочу сохранить это содержимое ответа, не возвращая его.

Да, если я верну функцию, я получу результаты, но когда я распечатаю ее, я не найду результатов. Кроме того, если я отправлю запрос на публикацию, я получаю сообщение об ошибке: Entity not found.

Я прочитал документы starlette и fastapi, но не смог найти обходного пути. Обратные вызовы тоже не помогли.

Ответы

1 SudipKandel Aug 20 2020 at 14:59

У меня не было способа сохранить ответ, не возвращаясь напрямую с помощью fastapi / starlette . Но я нашел обходной путь для выполнения этой задачи.

  • Для людей, пытающихся реализовать то же самое, пожалуйста, подумайте об этом.
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')))

Пожалуйста, дайте мне знать, если есть лучшие подходы.

TD Jan 28 2021 at 23:44

У меня та же проблема, и мне нужно было вызвать сторонний API с помощью асинхронного способа. Я пробовал много способов и нашел решение с библиотекой request-async, и оно работает для меня.

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 также вы можете использовать это видео, которое он использует httpx