Einführung in Plumber und REST
Verstehen Sie REST-Prinzipien und kennzeichnen Sie R-Funktionen als API-Endpunkte
Einführung in Plumber und REST ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist eine REST-API?
Eine REST-API (Representational State Transfer) ist ein Webservice, der Daten und Operationen über HTTP bereitstellt. Die wichtigsten Prinzipien:
- Zustandslos: Jede Anfrage enthält alle benötigten Informationen; es gibt keine serverseitige Sitzung.
- Ressourcenorientiert: Endpunkte repräsentieren Ressourcen (
/users,/predictions). - Standardisierte HTTP-Verben: GET (lesen), POST (erstellen), PUT (aktualisieren), DELETE (entfernen).
- JSON: Das Standarddatenformat für Anfrage- und Antwortinhalte.
# 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')Annotationssyntax von plumber
plumber verwendet spezielle Kommentar-Annotations, die mit #* beginnen, um API-Endpunkte zu definieren. Platzieren Sie eine Annotation direkt über der R-Funktion, die den Endpunkt verarbeitet. Die Funktionsargumente werden den Anfrageparametern zugeordnet; der Rückgabewert wird zum JSON-Antwortinhalt.
# 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() – Einen Plumber-Router erstellen
pr('plumber.R') liest eine plumber-Datei ein und erstellt ein Router-Objekt, das alle annotierten Endpunkte registriert. Der Router ist das zentrale Objekt, das Sie vor dem Start konfigurieren (Filter, Serialisierer usw. hinzufügen).
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() – Den Server starten
pr_run(router, host, port) startet den plumber-API-Server. Standardmäßig wird er an 127.0.0.1:8000 gebunden. Setzen Sie host = '0.0.0.0', um Verbindungen über jede Netzwerkschnittstelle zuzulassen (erforderlich für Docker oder den Fernzugriff).
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__/')@get-Annotation
Die Annotation #* @get /path ordnet eine GET-Anfrage der Funktion zu. Query-String-Parameter (z. B. ?name=Alice) werden automatisch als R-Funktionsargumente übergeben. Wenn keine Konvertierungsannotation angegeben ist, werden die Parameter als Zeichenketten übergeben.
# 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"}@post-Annotation
Die Annotation #* @post /path ordnet eine POST-Anfrage der Funktion zu. Der Anfrageinhalt (typischerweise JSON) ist über das spezielle Argument req als req$body zugänglich (bei einem JSON-Anfrageinhalt als geparste Liste). POST wird für Vorgänge verwendet, die Ressourcen erstellen oder Berechnungen auslösen.
# 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)
)
}JSON-Serialisierer
Standardmäßig serialisiert plumber Rückgabewerte mithilfe von jsonlite in JSON. Die Annotation #* @serializer json macht dies explizit. Sie können Optionen des Serialisierers wie Pretty-Printing oder die Behandlung von Nullwerten konfigurieren, indem Sie sie als JSON-Liste in der Annotation angeben.
# 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]}HTTP-Verben – PUT, DELETE, PATCH
plumber unterstützt alle standardmäßigen HTTP-Verben über entsprechende Annotationen:
#* @put /path: vollständiges Ersetzen einer Ressource.#* @delete /path: Entfernen einer Ressource.#* @patch /path: teilweises Aktualisieren einer Ressource.#* @head /path: nur Header (kein Inhalt).
# 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)
}Pfadparameter
Pfadparameter werden mit spitzen Klammern in der Route definiert: /user/. plumber extrahiert den Wert aus der URL und übergibt ihn als Funktionsargument mit demselben Namen. Sie unterscheiden sich von Query-Parametern, die nach ? erscheinen.
# 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)
)
}Fehlerbehandlung
Wenn eine R-Funktion einen Fehler auslöst, fängt plumber ihn ab und gibt eine HTTP-Antwort mit Status 500 zurück, die die Fehlermeldung als JSON enthält. Bei APIs für Endbenutzer sollten Sie geeignete HTTP-Statuscodes explizit mit res$status zurückgeben und für Validierungsfehler stop() verwenden.
# 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)
}Automatisch generierte Swagger-Dokumentation
plumber generiert aus Ihren Annotationen automatisch eine interaktive Swagger-UI-Dokumentation. Rufen Sie bei laufendem Server /__docs__/ auf, um alle Endpunkte und ihre Parameter anzuzeigen und sie im Browser auszuprobieren. Verwenden Sie #* @tag, um Endpunkte logisch zu gruppieren.
# 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))
}Kurzer Test
Was ist in plumber der Unterschied zwischen einem Query-Parameter (z. B. /greet?name=Alice) und einem Pfadparameter (z. B. /user/42)?
Zusammenfassung: plumber und REST
Die wichtigsten Erkenntnisse aus der Einführung in plumber und REST:
- REST ist zustandslos und ressourcenorientiert, verwendet standardisierte HTTP-Verben und gibt JSON zurück.
- plumber ordnet R-Funktionen mithilfe von
#*-Annotationen über den Funktionen Endpunkten zu. pr('file.R')erstellt einen Router;pr_run(api, host, port)startet den Server.#* @get /pathverarbeitet GET;#* @post /pathverarbeitet POST.- Pfadparameter:
/user/; Query-Parameter:/search?term=foo. - Geben Sie benannte Listen zurück – plumber serialisiert sie automatisch in JSON.
- Die Swagger-UI wird aus Ihren Annotationen automatisch unter
/__docs__/generiert.
# 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)Häufig gestellte Fragen
Ist die Lektion „Einführung in Plumber und REST“ kostenlos?
Ja — der vollständige Text von „Einführung in Plumber und REST“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Einführung in Plumber und REST“?
Verstehen Sie REST-Prinzipien und kennzeichnen Sie R-Funktionen als API-Endpunkte Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um R Academy zu starten?
Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Einführung in Plumber und REST“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?
Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Einführung in Plumber und REST
- GET- und POST-Endpunkte erstellen
- Authentifizierung und API-Sicherheit
- Plumber-APIs in der Produktion bereitstellen