Traffine I/O

Bahasa Indonesia

2022-07-05

Dokumentasi API dalam FastAPI

Dokumentasi Otomatis FastAPI

FastAPI, secara default, menyediakan dukungan out-of-the-box untuk dua alat paling kuat dalam dokumentasi API otomatis - Swagger UI dan ReDoc. Kedua alat ini menginterpretasikan spesifikasi OpenAPI yang dihasilkan oleh FastAPI dari kode Anda, memberikan antarmuka yang ramah pengembang yang dapat digunakan untuk memahami cara berinteraksi dengan API Anda.

Swagger UI

Swagger UI adalah alat populer untuk menghasilkan dokumentasi API yang interaktif. Dengan Swagger UI, pengembang dapat dengan mudah menjelajahi semua endpoint yang berbeda dari API Anda, beserta detail terkait seperti metode HTTP, parameter, body permintaan, dan respons.

Untuk mengakses Swagger UI dalam aplikasi FastAPI, Anda hanya perlu navigasi ke endpoint /docs pada server FastAPI yang sedang berjalan. Misalnya, jika aplikasi Anda berjalan secara lokal pada port 8000, Anda akan pergi ke http://localhost:8000/docs.

Swagger UI

Swagger UI menyediakan antarmuka intuitif di mana pengembang tidak hanya dapat melihat detail API Anda, tetapi juga berinteraksi dengannya. Interaksi ini difasilitasi oleh tombol "Try it out", yang memungkinkan pengembang untuk membuat permintaan ke API Anda langsung dari browser dan melihat respons secara real-time.

ReDoc

ReDoc adalah alat lain untuk menghasilkan dokumentasi API yang indah, mudah dibaca, dan interaktif. Sementara Swagger UI fokus pada interaktivitas, ReDoc menonjol dalam menyajikan tata letak tiga panel yang bersih dengan fokus pada kejelasan dan keterbacaan.

Untuk mengakses antarmuka ReDoc, Anda navigasi ke endpoint /redoc pada server FastAPI yang sedang berjalan. Misalnya, jika aplikasi Anda berjalan secara lokal pada port 8000, Anda akan pergi ke http://localhost:8000/redoc.

Redoc

ReDoc menyajikan tampilan yang lebih minimalis dan linear dari endpoint API Anda, yang mungkin lebih mudah dinavigasi oleh beberapa pengembang. Ini masih menyajikan semua detail penting seperti endpoint, metode, parameter, dan respons, tetapi dengan cara yang lebih efisien. Namun, berbeda dengan Swagger UI, ReDoc tidak menawarkan opsi untuk berinteraksi dengan API secara langsung dari dokumentasi.

Menambahkan Metadata ke API Anda

Metadata dalam API Anda pada dasarnya adalah data tentang API Anda. Ini memberikan detail kontekstual dan informasi deskriptif tentang fungsionalitas API Anda. FastAPI memungkinkan Anda dengan mudah mendefinisikan metadata untuk API Anda, dan metadata ini akan disertakan dalam skema OpenAPI yang dihasilkan, sehingga terlihat dalam dokumentasi API otomatis.

Mendefinisikan Metadata API

Anda dapat mendefinisikan metadata untuk aplikasi FastAPI Anda saat membuat instance dari kelas FastAPI. Berikut adalah contoh:

python
from fastapi import FastAPI

app = FastAPI(
    title="My Super API",
    description="This is a very custom API for our organization",
    version="2.5.0",
)

Dalam contoh ini, metadata mencakup judul API, deskripsi, dan versi. Informasi ini akan muncul di bagian atas dokumentasi API Anda baik dalam Swagger UI maupun ReDoc.

Menambahkan Metadata ke Rute API

FastAPI juga memungkinkan Anda untuk menambahkan metadata ke setiap rute API secara individu. Hal ini dapat dilakukan menggunakan parameter tags pada dekorator rute FastAPI, yang mengelompokkan rute-rute terkait dalam dokumentasi.

python
@app.get("/items/", tags=["items"])
async def read_items():
    return [{"name": "Item 1"}, {"name": "Item 2"}]

@app.get("/users/", tags=["users"])
async def read_users():
    return [{"username": "user1"}, {"username": "user2"}]

Dalam contoh ini, rute /items/ dan /users/ dikelompokkan dalam tag "items" dan "users" masing-masing. Dalam dokumentasi yang dihasilkan, endpoint akan dikelompokkan berdasarkan tag tersebut, sehingga memudahkan navigasi dalam API.

Menambahkan Deskripsi ke Rute API

Anda dapat menambahkan deskripsi ke rute-rute Anda menggunakan docstring. Baris pertama dalam docstring digunakan sebagai ringkasan, dan baris-baris berikutnya digunakan sebagai deskripsi.

python
@app.get("/items/{item_id}")
async def read_item(item_id: str):
    """
    Get a specific item by ID.

    - **item_id**: ID of the item to get
    """
    return {"item_id": item_id}

Dalam contoh ini, ringkasan ("Get a specific item by ID.") dan deskripsi ("- **item_id**: ID of the item to get") akan disertakan dalam dokumentasi API untuk rute /items/{item_id}.

Mendokumentasikan Model Respons

FastAPI menggunakan model Pydantic untuk mendefinisikan struktur data respons. Model-model ini memberikan cara untuk mendefinisikan keluaran yang diharapkan dari endpoint API Anda, dan secara otomatis menghasilkan definisi JSON Schema untuk dokumentasi API Anda.

Penggunaan Dasar Model Respons

Untuk menentukan model respons untuk sebuah rute, Anda dapat menggunakan parameter response_model pada dekorator rute. Contoh berikut menjelaskan konsep ini:

python
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float

app = FastAPI()

@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: str):
    # implementation omitted
    pass

Dalam contoh ini, parameter response_model menentukan bahwa rute /items/{item_id} akan mengembalikan sebuah instansi model Item. FastAPI akan menggunakan informasi ini untuk memvalidasi data respons, mengubahnya menjadi JSON, dan menyertakannya dalam skema OpenAPI untuk API Anda.

Menambahkan Deskripsi ke Model Respons

Anda dapat menambahkan deskripsi untuk model respons dengan menggunakan parameter responses pada dekorator rute. Parameter ini menerima sebuah kamus di mana kunci-kunci adalah kode status HTTP, dan nilainya adalah kamus yang berisi deskripsi dan model untuk respons tersebut.

python
@app.get("/items/{item_id}", responses={200: {"model": Item, "description": "The requested item"}})
async def read_item(item_id: str):
    # implementation omitted
    pass

Dalam contoh ini, parameter responses digunakan untuk menentukan deskripsi ("The requested item") untuk respons dengan kode status 200 yang menggunakan model Item. Deskripsi ini akan terlihat dalam dokumentasi API.

Mendokumentasikan Respons yang Berbeda

FastAPI memungkinkan Anda untuk menentukan respons yang berbeda menggunakan parameter responses. Anda dapat menentukan model atau struktur data yang berbeda untuk kode status yang berbeda.

python
@app.get("/items/{item_id}", responses={
    200: {"model": Item, "description": "The requested item"},
    404: {"description": "Item not found"},
    400: {"description": "Invalid request", "content": {"application/json": {"example": {"detail": "Invalid item ID"}}}},
})
async def read_item(item_id: str):
    # implementation omitted
    pass

Dalam contoh ini, parameter responses digunakan untuk mendokumentasikan kemungkinan respons dengan kode status 200, 404, dan 400. Untuk kode status 400, contoh respons juga disertakan.

Mendokumentasikan Parameter Query dan Body Permintaan

Dalam FastAPI, parameter query dan body permintaan biasanya didefinisikan menggunakan hint tipe Python bersama dengan model Pydantic. Ini memberikan cara yang jelas dan ringkas untuk menentukan data apa yang diharapkan dalam sebuah permintaan. Namun, untuk membuat dokumentasi API yang komprehensif, Anda mungkin perlu menambahkan informasi tambahan seperti deskripsi, contoh, dan batasan validasi. FastAPI memudahkan hal ini dengan menyediakan kelas Query dan Body untuk parameter query dan body permintaan.

Mendokumentasikan Parameter Query

Untuk menambahkan dokumentasi untuk parameter query, Anda dapat menggunakan kelas Query dari FastAPI. Kelas ini menyediakan cara untuk mendefinisikan parameter query dengan metadata tambahan.

python
from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, description="The query string to filter items", example="item_name")):
    return {"q": q}

Dalam contoh ini, kelas Query digunakan untuk menambahkan deskripsi dan contoh untuk parameter query q. Ketika melihat dokumentasi dalam Swagger UI atau ReDoc, informasi tambahan akan ditampilkan bersama dengan parameter tersebut.

Mendokumentasikan Body Permintaan

Untuk menambahkan dokumentasi untuk body permintaan, Anda dapat menggunakan kelas Body dari FastAPI. Kelas ini memungkinkan Anda mendefinisikan body permintaan dengan metadata tambahan.

python
from fastapi import FastAPI, Body
from pydantic import BaseModel
from typing import Optional

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item = Body(..., description="The item to create", example={"name": "item_name", "price": 42.0})):
    return {"item": item}

Dalam contoh ini, kelas Body digunakan untuk menambahkan deskripsi dan contoh untuk body permintaan item. Informasi tambahan ini akan ditampilkan dalam dokumentasi API bersama dengan body permintaan.

Mendokumentasikan Field dalam Model Pydantic

Anda juga dapat memberikan dokumentasi untuk field-field individual dalam model Pydantic menggunakan kelas Field dari Pydantic.

python
from pydantic import BaseModel, Field
from typing import Optional

class Item(BaseModel):
    name: str = Field(..., description="The name of the item", example="item_name")
    description: Optional[str] = Field(None, description="A brief description of the item", example="A sample item")
    price: float = Field(..., description="The price of the item", example=42.0)
    tax: Optional[float] = Field(None, description="The tax on the item", example=3.5)

Dalam contoh ini, kelas Field digunakan untuk menambahkan deskripsi dan contoh untuk setiap field dalam model Item. Informasi ini akan ditampilkan dalam dokumentasi API ketika model tersebut digunakan sebagai input atau output.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!