ruby-on-rails

Ruby On Rails’ te API Yazalım

Bu yazıda Ruby On Rails te API nasıl hazırlanır onu anlatmaya çalışacağım. API (Application Programming Interfece) Uygulama Programlama Arayüzü , bir yazılımın başka bir yazılımın fonksiyonlarını kullanabilmesi için oluşturulmuş bir sistemdir. Diyelim ki çalışan bir sisteminiz var. Sisteminizde bulunan bazı verileri başka sistemlerle, başka platformlarla paylaşmak istiyorsunuz. İşte size bunu sağlayan sisteme API deniliyor. Uygulamamızda […]

Bu yazıda Ruby On Rails te API nasıl hazırlanır onu anlatmaya çalışacağım. API (Application Programming Interfece) Uygulama Programlama Arayüzü , bir yazılımın başka bir yazılımın fonksiyonlarını kullanabilmesi için oluşturulmuş bir sistemdir.

Diyelim ki çalışan bir sisteminiz var. Sisteminizde bulunan bazı verileri başka sistemlerle, başka platformlarla paylaşmak istiyorsunuz. İşte size bunu sağlayan sisteme API deniliyor.

Uygulamamızda books diye bir tablomuz var ve bu tabloya ait id , name ve author alanlarmız bulunmakta. Tabloda kayıtlı olan kitapları API yardımı ile kullanıcılara sunacağız.

books isminde bir controller oluşturuyoruz.

rails generate controller books

respond_to ve respond_with metodlarını kullanarak çok kolay bir şekilde verileri sunabilmekteyiz.
respond_to metodunu hangi formatlarda veri döndüreceğimizi belirtmek için kullanacağız. respond_with metodu ile de istenilen veriyi döndüreceğiz. Uygulamamızda hem xml hem de json formatında veri döndürebilmek için respond_to metoduna

class ApplicationController < ActionController::Base
  respond_to :json,:xml
end

şeklinde döndüreceğimiz formatları ekliyoruz.

Şimdide verileri sunmaya başlayalım. Tüm kitapları döndürmek için ;

class BooksController < ApplicationController
  def index
    @books=Book.find(:all)
    respond_with(@books)
  end
end

Tüm kitapları @books değişkenine aktarıyoruz. Sonrada respond_with metodu yardımıyla döndürüyoruz. Burada veritabanındaki tüm alanlarımız dönecektir.Sadece istediğimiz alanları döndürmek için;

 respond_with(@books,:only => ['name','author'])

API miz için gerekli olan bir diğer şey ise durum kodları. Durum kodları yardımı ile istemci API den hangi cevabın döndüğünü anlayabilmektetir. Drum kodunu döndürmek için;

respond_with(@book,:only=>['name', 'author'],:status=>:ok)

Rails’te durum kodlarına ve sembol haritasına buradan ulaşabilirsiniz.

Birde API ye JSONP desteği vermek kaldı .

respond_with(@book,:only=>['name', 'author'],:status=>:ok,:callback=>params[:callback])

şeklinde de JSONP olarak verileri döndürüyoruz.

İstemci /books/index.json olarak istekte bulunursa;

[
    {
        "author":"Jason Fried & HeinemeierHansson","name":"Rework"
    },
    {
        "author":"Ahmet Umit","name":"Kar Kokusu"
    }
]

/books/index.xml olarak istekte bulunursa;

<books type="array">  <book>
    <name>Rework</name>
    <author>Jason Fried &amp; HeinemeierHansson</author>
  </book>
  <book>
    <name>Kar Kokusu</name>
    <author>Ahmet Umit</author>
  </book>
</books>

/books/index.json?callback=callback olarak istekte bulunursa;

callback([
    {
        "author":"Jason Fried & HeinemeierHansson",
        "name":"Rework"
    },
    {
        "author":"Ahmet Umit",
        "name":"Kar Kokusu"
    }
])

Şeklinde veriler dönmekte.

Şimdide de ismi gönderilen kitabın yazarını geri döndüren bir fonksiyon yazalım.

def show
    @book=Book.find_by_name(params[:name])
    if @book.nil?
      @error={'error'=>'Book not found'}
      respond_with(@error,:status=>:not_found,:callback=>params[:callback])
    else
      respond_with(@book,:only=>['author'],:status=>:ok,:callback=>params[:callback])
    end
end

İstemci /books/show.json?name=Book Name şeklinde istekte bulunacak. Fonksiyon params[:name] ile Kitap ismini alıp veritabanında sorguluyor. Kitap veritabanında mevcut ise yazar ismini;

respond_with(@book,:only=>['author'],:status=>:ok,:callback=>params[:callback])

döndürüyoruz.
Eğer kitap veritabanında yoksa ‘Book not found’ şeklinde bir hata mesajı döndürüyoruz. Durum
kodunu ise 404 Not Found olarak döndürüyoruz.

@error={'error'=>'Book not found'}
respond_with(@error,:status=>:not_found, :callback=>params[:callback])

Uygulamaya github üzerinden ulaşabilirsiniz.

Umarım faydalı bir yazı olmuştur. İyi çalışmalar.