0Pricing
R Academy · Ders

Plumber ve REST'e Giriş

REST ilkelerini anlayın ve R işlevlerine API uç noktaları olarak açıklama ekleyin.

Plumber ve REST'e Giriş, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.

REST API Nedir?

REST (Temsili Durum Aktarımı) API'si, HTTP üzerinden veri ve işlemler sunan bir web hizmetidir. Temel ilkeler:

  • Durumsuz: Her istek için gereken tüm bilgileri istek içerir; sunucu tarafında oturum tutulmaz.
  • Kaynak odaklı: Uç noktalar kaynakları temsil eder (/users, /predictions).
  • Standart HTTP fiilleri: GET (okuma), POST (oluşturma), PUT (güncelleme), DELETE (kaldırma).
  • JSON: İstek ve yanıt gövdeleri için standart veri biçimidir.
# 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')

plumber Açıklama Sözdizimi

plumber, API uç noktalarını tanımlamak için #* ile başlayan özel yorum açıklamalarını kullanır. Açıklamayı, uç noktayı işleyen R işlevinin hemen üstüne yerleştirin. İşlev bağımsızları istek parametrelerine eşlenir; dönüş değeri JSON yanıt gövdesine dönüşür.

# 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() — Plumber Yönlendiricisi Oluşturma

pr('plumber.R'), bir plumber dosyasını okur ve açıklama eklenmiş tüm uç noktaları kaydeden bir yönlendirici nesnesi oluşturur. Yönlendirici, çalıştırmadan önce yapılandırdığınız merkezi nesnedir (filtreler, serileştiriciler ve benzerlerini ekleyebilirsiniz).

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() — Sunucuyu Başlatma

pr_run(router, host, port), plumber API sunucusunu başlatır. Varsayılan olarak 127.0.0.1:8000 adresine bağlanır. Herhangi bir ağ arayüzünden bağlantı kabul etmek için host = '0.0.0.0' ayarlayın (Docker veya uzaktan erişim için gereklidir).

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 Açıklaması

#* @get /path açıklaması, bir GET isteğini işleve eşler. Sorgu dizesi parametreleri (ör. ?name=Alice) R işlev bağımsızları olarak otomatik biçimde aktarılır. Dönüştürme açıklaması verilmezse parametreler karakter dizileri olarak gelir.

# 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 Açıklaması

#* @post /path açıklaması, bir POST isteğini işleve eşler. İstek gövdesine (genellikle JSON) özel req bağımsızı üzerinden req$body olarak erişilebilir (istek gövdesi JSON ise ayrıştırılmış bir liste şeklindedir). POST, kaynak oluşturan veya hesaplama başlatan işlemler için kullanılır.

# 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 Serileştirici

Varsayılan olarak plumber, dönüş değerlerini jsonlite kullanarak JSON'a serileştirir. #* @serializer json açıklaması bunu açıkça belirtir. Serileştirici seçeneklerini, örneğin okunaklı biçimlendirme veya boş değer işleme seçeneklerini, açıklamada JSON listesi olarak belirtebilirsiniz.

# 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 Fiilleri — PUT, DELETE, PATCH

plumber, eşleşen açıklamalar aracılığıyla tüm standart HTTP fiillerini destekler:

  • #* @put /path: Bir kaynağın tamamen değiştirilmesi.
  • #* @delete /path: Bir kaynağın kaldırılması.
  • #* @patch /path: Bir kaynağın kısmen güncellenmesi.
  • #* @head /path: Yalnızca üst bilgiler (gövde yok).
# 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)
}

Yol Parametreleri

Yol parametreleri, rotada açılı ayraçlar kullanılarak tanımlanır: /user/. plumber değeri URL'den çıkarır ve aynı ada sahip bir işlev bağımsızı olarak aktarır. Bunlar, ? işaretinden sonra görünen sorgu parametrelerinden farklıdır.

# 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)
  )
}

Hata İşleme

Bir R işlevi hata verdiğinde plumber hatayı yakalar ve hata iletisini JSON olarak içeren 500 HTTP yanıtı döndürür. Kullanıcıya açık API'lerde uygun HTTP durum kodlarını res$status ve doğrulama hataları için stop() kullanarak açıkça döndürün.

# 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)
}

Otomatik Oluşturulan Swagger Belgeleri

plumber, açıklamalarınızdan etkileşimli Swagger kullanıcı arayüzü belgelerini otomatik olarak oluşturur. Sunucu çalışırken tüm uç noktaları, parametrelerini görmek ve bunları tarayıcıda denemek için /__docs__/ adresini ziyaret edin. Uç noktalarını mantıksal olarak gruplamak için #* @tag kullanın.

# 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))
}

Hızlı Kontrol

plumber'da sorgu parametresi (ör. /greet?name=Alice) ile yol parametresi (ör. /user/42) arasındaki fark nedir?

plumber ve REST Özeti

plumber ve REST'e Giriş konusundan önemli çıkarımlar:

  • REST: durumsuzdur, kaynak odaklıdır, standart HTTP fiillerini kullanır ve JSON döndürür.
  • plumber, işlevlerin üstündeki #* açıklamalarını kullanarak R işlevlerini uç noktalarla eşler.
  • pr('file.R') bir yönlendirici oluşturur; pr_run(api, host, port) sunucuyu başlatır.
  • #* @get /path GET isteklerini; #* @post /path POST isteklerini işler.
  • Yol parametreleri: /user/; sorgu parametreleri: /search?term=foo.
  • Adlandırılmış listeler döndürün — plumber bunları otomatik olarak JSON'a serileştirir.
  • Swagger kullanıcı arayüzü, açıklamalarınızdan /__docs__/ adresinde otomatik olarak oluşturulur.
# 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)

Sıkça Sorulan Sorular

“Plumber ve REST'e Giriş” dersi ücretsiz mi?

Evet — “Plumber ve REST'e Giriş” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.

“Plumber ve REST'e Giriş” dersinde ne öğreneceğim?

REST ilkelerini anlayın ve R işlevlerine API uç noktaları olarak açıklama ekleyin. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

R Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Plumber ve REST'e Giriş” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu R Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Plumber ve REST'e Giriş
  2. GET ve POST Uç Noktaları Oluşturma
  3. Kimlik Doğrulama ve API Güvenliği
  4. Plumber API'lerini Üretim Ortamına Dağıtma
← R Academy Sayfasına Dön