Pengantar Plumber dan REST
Pahami prinsip REST dan beri anotasi pada fungsi R sebagai titik akhir API.
Pengantar Plumber dan REST adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Apa Itu REST API?
REST (Representational State Transfer) API adalah layanan web yang mengekspos data dan operasi melalui HTTP. Prinsip-prinsip utamanya:
- Tanpa status: setiap permintaan berisi semua informasi yang diperlukan; tidak ada sesi di sisi server.
- Berorientasi sumber daya: endpoint merepresentasikan sumber daya (
/users,/predictions). - Verba HTTP standar: GET (membaca), POST (membuat), PUT (memperbarui), DELETE (menghapus).
- JSON: format data standar untuk isi permintaan dan respons.
# REST API concepts in HTTP terms:
# GET /api/model/predict?x=5 -> read a prediction
# POST /api/model/train -> create a new model
# GET /api/data/summary -> read data summary
# DELETE /api/cache/flush -> remove cached results
# Plumber maps R functions to these HTTP endpoints
cat('REST: stateless, resource-oriented, JSON responses')Sintaks Anotasi plumber
plumber menggunakan anotasi komentar khusus yang diawali #* untuk mendefinisikan endpoint API. Letakkan anotasi tepat di atas fungsi R yang menangani endpoint tersebut. Argumen fungsi dipetakan ke parameter permintaan; nilai yang dikembalikan menjadi isi respons JSON.
# plumber.R
library(plumber)
#* @get /ping
function() {
list(status = 'ok', time = Sys.time())
}
#* @get /add
#* @param a:int First number
#* @param b:int Second number
function(a, b) {
list(result = as.integer(a) + as.integer(b))
}pr() — Membuat Router Plumber
pr('plumber.R') membaca file plumber dan membuat objek router yang mendaftarkan semua endpoint beranotasi. Router adalah objek utama yang Anda konfigurasikan (menambahkan filter, serializer, dan sebagainya) sebelum menjalankannya.
library(plumber)
# Create a router from a plumber file
api <- pr('plumber.R')
# Inspect registered routes
print(api$routes)
# Alternatively, define inline without a file:
api <- pr() |>
pr_get('/ping', function() list(status = 'ok')) |>
pr_post('/echo', function(req) req$body)pr_run() — Memulai Server
pr_run(router, host, port) memulai server API plumber. Secara default, server mengikat ke 127.0.0.1:8000. Tetapkan host = '0.0.0.0' untuk menerima koneksi dari antarmuka jaringan mana pun (diperlukan untuk Docker atau akses jarak jauh).
library(plumber)
api <- pr('plumber.R')
# Start server on localhost port 8000
# pr_run(api, host = '127.0.0.1', port = 8000)
# For Docker/remote access, bind to all interfaces
# pr_run(api, host = '0.0.0.0', port = 8000)
# View auto-generated Swagger docs in browser
# (automatically available at /docs or /__docs__/ endpoint)
cat('Swagger UI auto-generated at http://localhost:8000/__docs__/')Anotasi @get
Anotasi #* @get /path memetakan permintaan GET ke fungsi tersebut. Parameter string kueri (misalnya ?name=Alice) secara otomatis diteruskan sebagai argumen fungsi R. Jika tidak ada anotasi konversi, parameter diterima sebagai string karakter.
# plumber.R
#* Greet a user by name
#* @param name:str The name to greet
#* @get /greet
function(name = 'World') {
list(
message = paste('Hello,', name),
timestamp = format(Sys.time(), '%Y-%m-%d %H:%M:%S')
)
}
# GET /greet?name=Alice
# -> {"message":"Hello, Alice","timestamp":"2026-01-01 12:00:00"}Anotasi @post
Anotasi #* @post /path memetakan permintaan POST ke fungsi tersebut. Isi permintaan (biasanya JSON) dapat diakses melalui argumen khusus req sebagai req$body (berupa daftar yang telah diuraikan jika isi permintaan adalah JSON). POST digunakan untuk operasi yang membuat sumber daya atau memicu komputasi.
# plumber.R
#* Run a linear model prediction
#* @post /predict
function(req) {
# req$body is already parsed from JSON
input_data <- as.data.frame(req$body)
# Run prediction with a pre-loaded model
predictions <- predict(trained_model, newdata = input_data)
list(
predictions = as.numeric(predictions),
n = nrow(input_data)
)
}Serializer JSON
Secara default, plumber membuat serial nilai yang dikembalikan menjadi JSON menggunakan jsonlite. Anotasi #* @serializer json membuat perilaku ini menjadi eksplisit. Anda dapat mengonfigurasi opsi serializer seperti pencetakan berformat atau penanganan null dengan menentukannya sebagai daftar JSON dalam anotasi.
# Default: automatic JSON serialization
#* @get /data
function() {
list(values = 1:5, labels = c('a', 'b', 'c', 'd', 'e'))
}
# Explicit JSON serializer with options
#* @serializer json list(na = 'null', auto_unbox = TRUE)
#* @get /data_explicit
function() {
list(value = 42, missing = NA)
}
# With auto_unbox=TRUE: {"value":42} not {"value":[42]}Verba HTTP — PUT, DELETE, PATCH
plumber mendukung semua verba HTTP standar melalui anotasi yang sesuai:
#* @put /path: penggantian penuh suatu sumber daya.#* @delete /path: menghapus suatu sumber daya.#* @patch /path: memperbarui sebagian suatu sumber daya.#* @head /path: hanya header (tanpa isi).
# plumber.R — CRUD-style endpoints
#* Update a model configuration
#* @put /config/<model_id>
function(model_id, req) {
config <- req$body
save_config(model_id, config)
list(updated = model_id, config = config)
}
#* Remove cached results
#* @delete /cache/<key>
function(key) {
cache_env <- globalenv()$cache
rm(list = key, envir = cache_env)
list(deleted = key)
}Parameter Jalur
Parameter jalur didefinisikan menggunakan tanda kurung sudut dalam rute: /user/. plumber mengekstrak nilainya dari URL dan meneruskannya sebagai argumen fungsi dengan nama yang sama. Parameter ini berbeda dari parameter kueri (yang muncul setelah ?).
# plumber.R
#* Get stats for a specific dataset
#* @param dataset_id:str The dataset identifier
#* @get /datasets/<dataset_id>/stats
function(dataset_id) {
if (!dataset_id %in% available_datasets()) {
stop(paste('Dataset not found:', dataset_id))
}
ds <- load_dataset(dataset_id)
list(
id = dataset_id,
rows = nrow(ds),
cols = ncol(ds),
names = names(ds)
)
}Penanganan Kesalahan
Ketika fungsi R menghasilkan kesalahan, plumber menangkapnya dan mengembalikan respons HTTP 500 dengan pesan kesalahan dalam JSON. Untuk API yang digunakan pengguna, kembalikan kode status HTTP yang sesuai secara eksplisit menggunakan res$status dan stop() untuk kesalahan validasi.
# plumber.R
#* Divide two numbers safely
#* @get /divide
function(a, b, res) {
a <- suppressWarnings(as.numeric(a))
b <- suppressWarnings(as.numeric(b))
if (is.na(a) || is.na(b)) {
res$status <- 400 # Bad Request
return(list(error = 'Both a and b must be numeric'))
}
if (b == 0) {
res$status <- 422 # Unprocessable Entity
return(list(error = 'Division by zero is not allowed'))
}
list(result = a / b)
}Dokumentasi Swagger yang Dibuat Otomatis
plumber secara otomatis membuat dokumentasi Swagger UI interaktif dari anotasi Anda. Kunjungi /__docs__/ saat server berjalan untuk melihat semua endpoint dan parameternya, serta mencobanya di peramban. Gunakan #* @tag untuk mengelompokkan endpoint secara logis.
# plumber.R with Swagger metadata
#* @apiTitle My ML Prediction API
#* @apiDescription Serves predictions from trained R models
#* @apiVersion 1.0.0
#* @tag model
#* @get /health
function() list(status = 'healthy')
#* Predict house price
#* @tag prediction
#* @param sqft:dbl Square footage
#* @param bedrooms:int Number of bedrooms
#* @get /predict
function(sqft = 1000, bedrooms = 3) {
pred <- predict(price_model, data.frame(sqft = as.numeric(sqft),
bedrooms = as.integer(bedrooms)))
list(predicted_price = round(as.numeric(pred), 2))
}Pemeriksaan Singkat
Dalam plumber, apa perbedaan antara parameter kueri (misalnya /greet?name=Alice) dan parameter jalur (misalnya /user/42)?
Ringkasan plumber dan REST
Hal-hal penting dari Pengantar plumber dan REST:
- REST: tanpa status, berorientasi sumber daya, menggunakan verba HTTP standar, dan mengembalikan JSON.
- plumber memetakan fungsi R ke endpoint menggunakan anotasi
#*di atas fungsi. pr('file.R')membuat router;pr_run(api, host, port)memulai server.#* @get /pathmenangani GET;#* @post /pathmenangani POST.- Parameter jalur:
/user/; parameter kueri:/search?term=foo. - Kembalikan daftar bernama — plumber secara otomatis membuat serialnya menjadi JSON.
- Swagger UI dibuat otomatis di
/__docs__/dari anotasi Anda.
# Complete minimal plumber API
library(plumber)
#* @apiTitle Simple Prediction API
#* Health check
#* @get /health
function() list(status = 'ok')
#* Predict mpg from weight
#* @param wt:dbl Car weight (1000 lbs)
#* @get /predict
function(wt = 3.0) {
pred <- predict(lm(mpg ~ wt, data = mtcars),
newdata = data.frame(wt = as.numeric(wt)))
list(wt = as.numeric(wt), predicted_mpg = round(pred, 2))
}
# Run:
# api <- pr('plumber.R')
# pr_run(api, port = 8000)Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengantar Plumber dan REST” gratis?
Ya — teks lengkap “Pengantar Plumber dan REST” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengantar Plumber dan REST”?
Pahami prinsip REST dan beri anotasi pada fungsi R sebagai titik akhir API. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Pengantar Plumber dan REST” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengantar Plumber dan REST
- Membuat Titik Akhir GET dan POST
- Autentikasi dan Keamanan API
- Menerapkan API Plumber ke Produksi