2026'da Rails API Modu: RESTful API, Serializasyon ve Mulakat Sorulari
Rails API-only modu ile production-ready RESTful API gelistirme: Alba ve jsonapi-serializer ile JSON serializasyonu, JWT authentication, hata yonetimi ve RSpec testleri.

Rails API modu, 2026 yilinda modern web ve mobil uygulamalarin backend katmanini olusturmak icin en yaygin tercih edilen yaklasimlardan biri olmaya devam ediyor. React, Vue veya mobil istemciler icin RESTful endpoint'ler gelistirildiginde, Rails'in API-only modu gereksiz gorunum katmanini, session middleware'lerini ve asset pipeline'i kaldirarak hem performans hem de kod netligi saglar. Bu rehber, Rails 8 ile production-grade API gelistirme surecini, serializasyon stratejilerini, JWT authentication desenlerini, hata yonetimini ve teknik mulakatlarda sikca karsilasilan konulari ayrintili olarak ele alir.
Rails API modu, oturum yonetimi, cookie'ler, gorunum katmani ve asset pipeline middleware'lerini kaldirarak hafif bir yapi sunar. Sonuc olarak JSON yanitlari icin optimize edilmis, mobil backend'ler, mikro hizmetler ve ayristirilmis SPA mimarileri icin ideal bir stack elde edilir.
Rails 8 API-Only Uygulama Kurulumu
Rails 8 ile API-only bir proje olusturmak, gereksiz middleware ve gorunum bilesenlerini kaldirarak optimize edilmis bir yapi sunar. --api bayragi, ApplicationController sinifini ActionController::Base yerine ActionController::API uzerinden yapilandirir ve tarayiciya ozgu 15'ten fazla middleware katmanini devre disi birakir.
# Terminal command
rails new order_service --api --database=postgresqlBu komut, view template'leri, asset derleme veya session cookie'leri olmayan bir proje olusturur. Olusturulan application.rb dosyasinda config.api_only = true ayari bulunur ve middleware yigini minimal seviyede tutulur.
Mevcut tam donanımli Rails uygulamalarina API namespace'i eklemek icin farkli bir yaklasim izlenir. ActionController::API'den tureyen bir base API controller olusturulur ve API route'lari versiyonlanmis bir namespace altinda tanimlanir.
# app/controllers/api/v1/base_controller.rb
module Api
module V1
class BaseController < ActionController::API
before_action :authenticate_request
private
def authenticate_request
# Token validation logic
end
end
end
endBu desen, mevcut tam donanımli uygulamayi korurken ayri bir API katmani eklenmesini saglar. Tum API controller'lari bu base class'tan turetilerek ortaklastirilmis authentication ve hata yonetimi davranislari miras alinir.
RESTful Route Tasarimi ve Versiyonlama
Temiz RESTful route tasarimi, API'nin kullanilabilirligini ve surdurulebilirligini dogrudan etkiler. Rails routing DSL, kaynak hiyerarsilerini ifade etmeyi kolaylastirir; ancak bazi konvansiyonlara uyum, saglam API'leri kirilgan olanlardan ayirir.
# config/routes.rb
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
resources :users, only: [:index, :show, :create, :update] do
resources :orders, only: [:index, :show, :create]
end
resources :products, only: [:index, :show] do
collection do
get :search
end
end
resource :session, only: [:create, :destroy]
end
end
endTemel konvansiyonlar asagidaki gibidir:
- Namespace versiyonlama (
/api/v1/): Header tabanli versiyonlamaya gore daha basit ve cache dostu bir yaklasimdir - Sig ic ice gecme: Tek seviyeyle sinirli tutulmalidir.
/users/:user_id/ordersuygun bir yapidir ancak/users/:user_id/orders/:order_id/itemsyerine/orders/:order_id/itemstercih edilmelidir - Tekil kaynaklar: Mevcut kullanicinin oturumunu veya profilini temsil eden endpoint'ler icin
resource(cogul degil) kullanilir
Bir API versiyonunu kullanimdan kaldirirken, istemcileri sessizce kirmak yerine HTTP 410 Gone yaniti ile birlikte yeni versiyona yonlendiren bir JSON govdesi dondurulmesi onerilen yaklasimdir.
JSON Serializasyonu: Alba ve jsonapi-serializer
Serializasyon, ActiveRecord nesnelerinin JSON yanitlarina nasil donusturulecegini belirler. Serializer secimi yanit surelerini, payload yapisini ve API sozlesme esnekligini dogrudan etkiler. 2026 yilinda Rails ekosisteminde iki kutuphane one cikar: hiz ve basitlik icin Alba, JSON:API spec uyumlulugu icin jsonapi-serializer.
Alba: Bagimliliksiz Yuksek Performans
Alba, Ruby nesnelerini eski alternatiflere gore 10 kata kadar daha hizli serialize eder. Sifir bagimliliga sahiptir ve hafif API servisleri icin ideal bir secimdir.
# app/resources/user_resource.rb
class UserResource
include Alba::Resource
root_key :user, :users
attributes :id, :email, :name, :created_at
attribute :full_name do |user|
"#{user.first_name} #{user.last_name}"
end
many :orders, resource: OrderResource
# Conditional attributes based on context
attribute :admin_notes, if: proc { |user, params|
params[:current_user]&.admin?
}
endAlba resource dosyalari controller icerisinde dogrudan kullanilir. Asagidaki ornekte UserResource sinifinin hem tekil hem de koleksiyon yanitlarinda nasil kullanildigi gorulmektedir.
# app/controllers/api/v1/users_controller.rb
class Api::V1::UsersController < Api::V1::BaseController
def show
user = User.includes(:orders).find(params[:id])
render json: UserResource.new(user, params: { current_user: current_user })
end
def index
users = User.where(active: true).page(params[:page])
render json: UserResource.new(users)
end
endjsonapi-serializer: Kati Spec Uyumlulugu
API tuketicileri data, type, attributes ve relationships anahtarlariyla JSON:API formatinda yanitlar beklediginde, jsonapi-serializer (Netflix'in fast_jsonapi kutuphanesinin surdurulen fork'u) bu formatlama islemini otomatik olarak gerceklestirir.
# app/serializers/user_serializer.rb
class UserSerializer
include JSONAPI::Serializer
set_type :user
set_id :id
attributes :email, :name, :created_at
has_many :orders, serializer: OrderSerializer
# Cache at the serializer level for high-traffic endpoints
cache_options store: Rails.cache, namespace: "jsonapi", expires_in: 1.hour
endSecim projenin gereksinimlerine baglidir. Dahili API'ler, mikro hizmetler ve payload esnekliginin onemli oldugu mobil backend'ler icin Alba tercih edilir. Standart sozlesmelerin entegrasyon surtunmesini azalttigi genel API'ler icin jsonapi-serializer daha uygun bir secimdir.
Ruby on Rails mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
Rails API'leri icin Kimlik Dogrulama Desenleri
Rails 8, session tabanli authentication'i iskeletleyen yerlesik bir kimlik dogrulama olusturucusu sunmustur. Bunu API-only moda uyarlamak, cookie oturumlarini token tabanli kimlik dogrulama ile degistirmeyi gerektirir. Iki yaygin desen bulunur: stateless mimariler icin JWT ve daha basit iptal mekanizmasi icin opaque bearer token'lar.
Kisa Omurlu JWT Token'lar
JWT, stateless authentication icin yaygin bir standarttir. Asagidaki servis sinifi, token olusturma ve cozumleme islemlerini kapsullemektedir.
# app/services/jwt_service.rb
class JwtService
SECRET = Rails.application.credentials.jwt_secret_key
ALGORITHM = "HS256"
def self.encode(payload, exp: 15.minutes.from_now)
payload[:exp] = exp.to_i
JWT.encode(payload, SECRET, ALGORITHM)
end
def self.decode(token)
body = JWT.decode(token, SECRET, true, algorithm: ALGORITHM).first
HashWithIndifferentAccess.new(body)
rescue JWT::ExpiredSignature, JWT::DecodeError => e
nil
end
endJWT servisi bir concern icerisinde kullanilarak tum API controller'larina uygulanir. Asagidaki concern, her istekte Authorization header'indan token'i cikarir ve dogrular.
# app/controllers/concerns/jwt_authenticatable.rb
module JwtAuthenticatable
extend ActiveSupport::Concern
included do
before_action :authenticate_request
end
private
def authenticate_request
token = request.headers["Authorization"]&.split(" ")&.last
decoded = JwtService.decode(token)
if decoded
@current_user = User.find_by(id: decoded[:user_id])
end
render json: { error: "Unauthorized" }, status: :unauthorized unless @current_user
end
def current_user
@current_user
end
endKisa omurlu erisim token'lari (15 dakika) ile refresh token rotasyonu guvenli bir denge saglar. Erisim token'i stateless kalirken, veritabaninda saklanan refresh token'lar sifre degisikligi veya cikis isleminde iptal edilebilir.
Opaque Bearer Token'lar
Her istekte veritabani sorgusu kabul edilebilir olan daha basit API'ler icin has_secure_token dogrudan bir yaklasim sunar.
# app/models/user.rb
class User < ApplicationRecord
has_secure_password
has_secure_token :api_token
def regenerate_api_token!
regenerate_api_token
end
endOpaque token'lar iptali basitlestirir (token silinir veya yeniden olusturulur) ancak her kimlik dogrulamali istekte veritabani sorgusu gerektirir. Dusuk trafik hacmine sahip dahili API'ler icin bu trade-off kabul edilebilir duzeydedir.
Token tabanli kimlik dogrulama kullanan API controller'lari CSRF dogrulamasini atlamalidir. skip_before_action :verify_authenticity_token ekleyin veya varsayilan olarak CSRF middleware icermeyen ActionController::API'den turetin.
API Genelinde Yapilandirilmis Hata Yonetimi
Tutarli hata yanitlari, profesyonel API'leri prototiplerden ayiran temel unsurlardan biridir. Merkezi bir hata yoneticisi, Rails'in varsayilan HTML hata sayfalarini dondurmesini engeller ve her basarisizligin yapilandirilmis JSON dondurmesini garantiler.
# app/controllers/concerns/error_handler.rb
module ErrorHandler
extend ActiveSupport::Concern
included do
rescue_from ActiveRecord::RecordNotFound, with: :not_found
rescue_from ActiveRecord::RecordInvalid, with: :unprocessable_entity
rescue_from ActionController::ParameterMissing, with: :bad_request
end
private
def not_found(exception)
render json: {
error: "not_found",
message: "Resource not found",
details: exception.message
}, status: :not_found
end
def unprocessable_entity(exception)
render json: {
error: "validation_failed",
message: "Validation failed",
details: exception.record.errors.full_messages
}, status: :unprocessable_entity
end
def bad_request(exception)
render json: {
error: "bad_request",
message: "Missing required parameter",
details: exception.message
}, status: :bad_request
end
endBu concern, base API controller'a dahil edilir. Boylece her endpoint uygun HTTP durum kodlari, makine tarafindan okunabilir hata tipleri ve insan tarafindan okunabilir mesajlarla ongorulebilir JSON hatalari dondurur. Production ortaminda bu yaklasim, API tuketicilerinin hata durumlarini programatik olarak islemesini kolaylastirir.
Sayfalama ve Yanit Optimizasyonu
Sinirsiz sorgular, performans dususunun en hizli yoludur. Her liste endpoint'i sonuclari sayfalamalı ve sayfalama meta verilerini acikca iletmelidir.
# app/controllers/api/v1/products_controller.rb
class Api::V1::ProductsController < Api::V1::BaseController
def index
products = Product
.where(active: true)
.order(created_at: :desc)
.page(params[:page])
.per(params[:per_page] || 25)
render json: {
data: ProductResource.new(products).serializable_hash,
meta: {
current_page: products.current_page,
total_pages: products.total_pages,
total_count: products.total_count
}
}
end
endSayfalama otesinde, API yanit surelerinde olculebilir fark yaratan uc temel optimizasyon bulunur:
- Eager loading:
includesveyapreloadile veritabani round-trip'lerini coglaltan N+1 sorgulari ortadan kaldirilir - Sadece gerekli sutunlar: Serializer'lar model ozniteliklerinin bir alt kumesini kullandiginda
.select(:id, :name, :price)ile sorgu optimize edilir - HTTP cache header'lari:
stale?vefresh_whenaraclariyla istemciler ve CDN'ler ozel mantik olmadan yanitlari cache'leyebilir
Rails API Endpoint'lerini RSpec ile Test Etme
API testleri durum kodlarini, yanit yapisini ve kimlik dogrulama kapilarini dogrulamalidir. RSpec'teki request spec'leri tam middleware yiginini test eder ve gercek API davranisinin en yakin temsilidir.
# spec/requests/api/v1/users_spec.rb
RSpec.describe "Api::V1::Users", type: :request do
let(:user) { create(:user) }
let(:token) { JwtService.encode(user_id: user.id) }
let(:headers) { { "Authorization" => "Bearer #{token}" } }
describe "GET /api/v1/users/:id" do
it "returns the user with correct structure" do
get "/api/v1/users/#{user.id}", headers: headers
expect(response).to have_http_status(:ok)
json = JSON.parse(response.body)
expect(json["user"]).to include(
"id" => user.id,
"email" => user.email,
"name" => user.name
)
end
it "returns 401 without authentication" do
get "/api/v1/users/#{user.id}"
expect(response).to have_http_status(:unauthorized)
end
it "returns 404 for non-existent user" do
get "/api/v1/users/0", headers: headers
expect(response).to have_http_status(:not_found)
json = JSON.parse(response.body)
expect(json["error"]).to eq("not_found")
end
end
endBu testler, her API endpoint'inin ele almasi gereken uc temel senaryoyu kapsar: basarili yanit yapisi, kimlik dogrulama zorunlulugu ve hata yanit formati. Request spec'leri, controller spec'lerinin aksine routing, middleware ve serialization katmanlarini da icerir.
Rails 8.1 API Ozellikleri
Rails 8.1 (Ekim 2025'te yayinlanan), API gelistirmeyle dogrudan ilgili onemli yetenekler ekledi:
- Continuable Jobs: Uzun suren arka plan gorevlerinin (veri ice aktarma, toplu isleme) dagitimlar veya yeniden baslatmalar sonrasinda son kontrol noktasindan devam etmesini saglar
- Structured Event Logging:
Rails.event.notify(...)araciyla ozel enstrumantasyon kodu olmadan APM platformlari (Datadog, New Relic) tarafindan tuketilebilir olaylar yayinlar - Deprecated Associations:
:warn,:raiseveya:notifymodlariyla isaretlenebilir, ekiplerin buyuk API kod tabanlarinda eski iliskileri asamali olarak kaldirmasina yardimci olur
Bu ozellikler API projelerinde sablon kodu azaltir ve gozlemlenebilirligi artirir.
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
Sonuc
Rails API modu ile production-ready backend servisleri gelistirmek icin asagidaki temel ilkeler goz onunde bulundurulmalidir:
--apimodunu kullanin: Ayristirilmis API servisleri icin gereksiz middleware'i ortadan kaldirarak yanit gecikmesini azaltin- Sozlesmeye uygun bir serializer secin: Hiz ve esneklik icin Alba, kati JSON:API uyumlulugu icin jsonapi-serializer
- Token kimlik dogrulamasi uygulayin: Kisa omurlu JWT'ler ve refresh rotasyonu veya daha basit iptal ihtiyaclari icin opaque bearer token'lar
- Hata yonetimini merkezilestirin: Paylasilan bir concern'de her endpoint'in tutarli hata tipleriyle yapilandirilmis JSON dondurmesini saglayin
- Her liste endpoint'ini sayfalayin ve N+1 sorgularini production'a ulasmadan eager loading ile ortadan kaldirin
- Request spec'lerle test edin: Uc temel senaryoya karsi dogrulama yapin: basari yapisi, auth zorunlulugu ve hata formati
- Rails 8.1 ozelliklerini benimseyin: Continuable jobs ve structured events ile API servislerinde guvenilirlik ve gozlemlenebilirligi artirin
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
Etiketler
Paylaş
İlgili makaleler

ActiveRecord: Ruby on Rails'te N+1 Sorgu Sorunlarını Çözmek
Rails'te ActiveRecord ile N+1 sorgularını tespit etme ve çözme rehberi. includes, preload, eager_load ve otomatik tespit araçlarına hâkim olun.

Ruby on Rails Mulakat Sorulari: 2026 En Iyi 25
En cok sorulan 25 Ruby on Rails mulakat sorusu. MVC mimarisi, Active Record, migration, RSpec testi, REST API ayrintili cevaplar ve kod ornekleri ile.

Ruby on Rails 7: Reaktif Uygulamalar icin Hotwire ve Turbo
Rails 7'de Hotwire ve Turbo icin kapsamli rehber. Turbo Drive, Frames ve Streams ile JavaScript yazmadan reaktif uygulamalar gelistirme.