จะเรียก api จาก api อื่นใน fastapi ได้อย่างไร?

Aug 19 2020

ฉันสามารถรับการตอบสนองของ API หนึ่งจากอีกอันหนึ่ง แต่ไม่สามารถจัดเก็บไว้ที่ใดที่หนึ่ง (ในไฟล์หรือบางอย่างก่อนที่จะส่งคืนการตอบกลับ) response=RedirectResponse(url="/apiname/")(ฉันต้องการเข้าถึงคำขอโพสต์ที่มีส่วนหัวและเนื้อหา)

ฉันต้องการจัดเก็บเนื้อหาการตอบกลับนี้โดยไม่ส่งคืน

ใช่ถ้าฉันส่งคืนฟังก์ชันฉันจะได้รับผลลัพธ์ แต่เมื่อฉันพิมพ์ฉันไม่พบผลลัพธ์ นอกจากนี้หากฉันส่งคำขอโพสต์ฉันจะได้รับข้อผิดพลาดไม่พบเอนทิตี

ฉันอ่านเอกสาร 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 ของบุคคลที่สามด้วยวิธีasyncดังนั้นฉันจึงลองหลายวิธีและฉันได้รับโซลูชันที่มีไลบรารี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