fastapiで別のAPIからAPIを呼び出す方法は?

Aug 19 2020

あるAPIの応答を別のAPIから取得できましたが、どこかに(応答を返す前にファイルなどに)保存できませんでした(response=RedirectResponse(url="/apiname/")ヘッダーと本文を使用してPOSTリクエストにアクセスしたい)

この応答内容を返送せずに保存したい。

はい、関数を返すと結果が得られますが、印刷しても結果が見つかりません。また、POSTリクエストを送信すると、エンティティが見つかりませんというエラーが表示されます。

スターレットと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を呼び出す必要がありました。それで、私は多くの方法を試し、requests-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を使用しているこのビデオを使用することができます