Rails APIs bauen - RESTful Web Services mit Rails
Modern Rails wird oft als reines Backend für APIs verwendet.
API-only Rails Setup
rails new api_app --api
Dies erstellt eine Rails-App optimiert für APIs (ohne Views).
HTTP-Methoden und Status-Codes
Standard HTTP-Verben
- GET: Daten abrufen (200 OK)
- POST: Neue Ressourcen erstellen (201 Created)
- PATCH/PUT: Bearbeiten (200 OK)
- DELETE: Löschen (204 No Content)
Error Status-Codes
- 400: Ungültige Request
- 401: Authentifizierung erforderlich
- 403: Zugriff verweigert
- 404: Nicht gefunden
- 500: Server-Fehler
Serialization
Konvertiere Ruby-Objekte zu JSON:
class PostSerializer < ActiveModel::Serializer
attributes :id, :title, :content
has_many :comments
end
Dann in Controller:
render json: @post, serializer: PostSerializer
Authentication mit JWT
JWT (JSON Web Token) für stateless Auth:
# Login
def login
user = User.find_by(email: params[:email])
if user && user.authenticate(params[:password])
token = encode_token(user.id)
render json: { token: token }
end
end
# Protected Routes
def authenticated_user
decoded = decode_token(request.headers['Authorization'])
@user = User.find(decoded['user_id'])
end
Versioning
URLs mit Version:
/api/v1/posts
/api/v2/posts
Allows alte Clients die alte Version zu nutzen.
Error Handling
class Api::PostsController < ApplicationController
rescue_from ActiveRecord::RecordNotFound do
render json: { error: 'Not found' }, status: 404
end
rescue_from ActiveRecord::RecordInvalid do |e|
render json: { errors: e.record.errors }, status: 422
end
end
Testing von APIs
Mit RSpec request specs:
describe 'GET /api/posts' do
it 'returns all posts' do
get '/api/posts'
expect(response.status).to eq(200)
expect(JSON.parse(response.body).size).to eq(2)
end
end
Dokumentation
Tools like Swagger/OpenAPI für API-Dokumentation.
/api/posts:
get:
summary: Get all posts
responses:
200:
description: Success
schema:
type: array
items:
$ref: '#/components/schemas/Post'
CORS (Cross-Origin Requests)
Browsers blockieren Cross-Origin Requests. Rails CORS Gem erlaubt es:
gem 'rack-cors'
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete]
end
end
Häufig gestellte Fragen
Warum API-only Rails?
Trennung von Backend und Frontend. Flexible für Mobile, Web, etc.
Brauche ich GraphQL statt REST?
REST ist Standard. GraphQL ist Alternative mit Vor- und Nachteilen. REST zum Lernen besser.
Wie teste ich APIs?
Mit Curl, Postman, oder RSpec request specs.
