API Documentation (OpenAPI) — API

Dokumentasi API yang baik adalah kunci agar developer lain (dan kamu sendiri di masa depan) bisa menggunakan API dengan mudah. OpenAPI Specification (dulunya…

Dokumentasi API adalah buku petunjuk untuk developer lain (dan kamu sendiri enam bulan lagi): endpoint apa saja yang ada, apa yang dikirim, apa yang kembali, dan apa yang bisa salah. Bayangin buku menu restoran. Menu yang baik menulis nama masakan, pilihan level pedas, isi porsinya, fotonya, dan catatan "kalau habis, diganti nasi goreng". Kamu bisa memesan tanpa memanggil pelayan untuk bertanya satu per satu. Di API, nama masakan itu endpoint, pilihan level itu parameter, isi porsi itu response, foto itu contoh, dan catatan "kalau habis" itu daftar error.

🧪 Tebakan cepat: schema Book di dokumentasi Toko Buku punya properties id, title, author_id, price, dan stock, tapi tanpa required. Server mengirim buku tanpa stock. Pemeriksa dokumentasi bilang response itu sah atau melanggar? Tebak dulu, jawabannya ada di bagian "Schema: bentuk datanya".

OpenAPI: satu file, dibaca manusia dan mesin

OpenAPI Specification (dulu bernama Swagger) adalah standar industri untuk menulis dokumentasi REST API dalam satu file YAML atau JSON. Pelajaran ini memakai versi 3.1; versi 3.0 juga masih banyak dipakai, dan untuk spec sesederhana ini tulisannya sama. Karena formatnya baku, satu file bisa dipakai banyak alat:

Di Laravel, Scribe atau L5-Swagger bisa membuat file-nya dari kode. Di Node, misalnya swagger-jsdoc.

Spec untuk GET /books

Ini dokumentasi endpoint GET /books Toko Buku, yang bisa difilter dengan ?author_id=2:

openapi: 3.1.0
info:
  title: API Toko Buku
  version: 1.3.0
servers:
  - url: https://api.tokobuku.test
paths:
  /books:
    get:
      summary: Daftar buku, bisa difilter per penulis
      parameters:
        - name: author_id
          in: query
          required: false
          schema:
            type: integer
      responses:
        "200":
          description: Daftar buku
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Book"
        "400":
          description: author_id bukan bilangan bulat
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Kesalahan di server
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
components:
  schemas:
    Book:
      type: object
      required: [id, title, author_id, price, stock]
      properties:
        id:
          type: integer
        title:
          type: string
        author_id:
          type: integer
        price:
          type: integer
        stock:
          type: integer
    Error:
      type: object
      required: [error]
      properties:
        error:
          type: string

Latihan memakai bentuk yang sama untuk GET /api/products dengan parameter category bertipe string, response "200" dan "500", dan Product berisi id, name, price.

Schema: bentuk datanya

Cek dokumentasi dengan response sungguhan

Dokumentasi yang basi lebih buruk dari gak ada dokumentasi: developer mengikuti petunjuk yang salah dengan yakin. Contoh: server versi baru mengirim "price": "89000" (teks), sedangkan dokumentasinya bilang integer. Aplikasi yang menjumlahkan harga malah menyambung teks: "89000" + 1000 jadi "890001000".

Karena spec-nya bisa dibaca mesin, ini bisa dicek otomatis. Contract test mengirim request, lalu mencocokkan response-nya dengan spec:

GET /books?author_id=1 -> 200 | response: body[0].price: harus integer, datang string "89000"
GET /books?author_id=dua -> 400 | request: author_id=dua bukan integer | response: cocok dengan spec

Prinsipnya disebut docs-as-code: file spec disimpan di repo yang sama dengan kode, diubah di pull request yang sama, dan dicek di CI. Jadi dokumentasi harus diperbarui bersama perubahan kode, supaya gak basi (outdated).

Isi dokumentasi yang baik

  1. Contoh request dan response yang bisa langsung disalin, misalnya lewat example:
              example:
                - id: 2
                  title: Bumi Manusia
                  author_id: 2
                  price: 125000
                  stock: 0
  1. Semua error: tiap status dan bentuk body-nya ({"error": "..."}), seperti di pelajaran Error Handling.
  2. Autentikasi: cara mendapat token dan cara mengirimnya (pelajaran Autentikasi). Di OpenAPI:
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

lalu security: [{ bearerAuth: [] }] di endpoint yang butuh login, misalnya POST /books.

  1. Batas: rate limit dan pagination (pelajaran Rate Limiting dan Pagination).
  2. Changelog per versi: apa yang ditambah, diubah, dihapus, misalnya "1.3.0: tambah filter author_id di GET /books". Perubahan yang merusak client butuh versi baru, seperti di pelajaran API Versioning.

⚠️ Jebakan yang sering ketemu

TL;DR: Dokumentasi API memberi tahu apa yang dikirim, apa yang kembali, dan apa yang bisa salah. Standar industrinya OpenAPI (dulu Swagger), satu file YAML atau JSON yang dibaca manusia (Swagger UI, Redoc) dan mesin (validator, generator). Satu endpoint ditulis di paths: parameters (misalnya - name: author_id, in: query, schema: type: integer) dan responses per status code ("200", "400", "500"), masing-masing dengan schema. Array memakai type: array dan items, object memakai properties, dan field wajib harus ditulis di required. Schema yang dipakai berulang ditulis sekali di components/schemas dan dirujuk dengan $ref. Dokumentasi yang baik punya contoh, semua error, autentikasi, dan changelog, dan diperbarui di PR yang sama dengan kodenya (docs-as-code) supaya gak basi.

Yang akan kamu pelajari