Learn Ruby logo
Navigation umschalten

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.

Verwandte Seiten