Screencast: Versionierung von REST APIs

APIs sollten konsistent sein. Dies ist allerdings schwer zu bewerkstelligen wenn verschiedene Formate unterstützt werden und/oder die APIs sich weiterentwickeln. In diesem Screencast zeigt Ryan wie eine API-Versionierung über die URL oder HTPP-Header realisiert werden können.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
rails g migration change_products_released_on
rake db:migrate
cp -R app/controllers/api/v1 app/controllers/api/v2
curl -H ‚Accept: application/vnd.example.v1‘ http://localhost:3000/api/products
[/bash]

routes.rb

[ruby]
require ‚api_constraints‘

Store::Application.routes.draw do
namespace :api, defaults: {format: ‚json‘} do
scope module: :v1, constraints: ApiConstraints.new(version: 1) do
resources :products
end
scope module: :v2, constraints: ApiConstraints.new(version: 2, default: true) do
resources :products
end
end

resources :products
root to: ‚products#index‘
end
[/ruby]

lib/api_constraints.rb

[ruby]
class ApiConstraints
def initialize(options)
@version = options[:version]
@default = options[:default]
end

def matches?(req)
@default || req.headers[‚Accept‘].include?("application/vnd.example.v#{@version}")
end
end
[/ruby]

app/controllers/api/v1/products_controller.rb

[ruby]
module Api
module V1
class ProductsController < ApplicationController
class Product < ::Product
# Note: this does not take into consideration the create/update actions for changing released_on
def as_json(options = {})
super.merge(released_on: released_at.to_date)
end
end

respond_to :json

def index
respond_with Product.all
end

def show
respond_with Product.find(params[:id])
end

def create
respond_with Product.create(params[:product])
end

def update
respond_with Product.update(params[:id], params[:product])
end

def destroy
respond_with Product.destroy(params[:id])
end
end
end
end
[/ruby]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site uses Akismet to reduce spam. Learn how your comment data is processed.