Raylarda Google Verileri

Eric Bidelman, Google Veri API'leri Ekibi
Şubat 2009

Giriş

"Ruet, istemci kitaplıkları listesinde nerede?"

Geliştiricilerimizin ağır iştahından ve Ruby on Rails'in (RoR) sürekli popülerliğinden motive olan iş arkadaşım Jeff Fisher, Doom Dağı'nın derinliklerinden bir Ruby enerji kütüphanesi oluşturdu. Tüm işlevlerin yer aldığı bir istemci kitaplığı olmadığını, ancak kimlik doğrulama ve temel XML manipülasyonu gibi temel bilgileri ele aldığını unutmayın. Ayrıca REXML modülünü ve XPath'i kullanarak doğrudan Atom feed'iyle çalışmanız gerekir.

Kitle

Bu makale, özellikle Roku on Rails'i kullanarak Google Veri API'larına erişmek isteyen geliştiriciler için hazırlanmıştır. Okuyucunun Ruby programlama dili ve Rails web geliştirme çerçevesi hakkında bilgi sahibi olduğu varsayılır. Örneklerin çoğunda Documents List API'sine odaklanıyorum ancak herhangi bir Data API'ye aynı kavramlar uygulanabilir.

Başlayın

Koşullar

Google Veri Rutin Yardımcı Programı Kitaplığı'nı yükleme

Kitaplığı almak için doğrudan proje barındırma bölümünden kitaplık kaynağını indirebilir veya mücevheri yükleyebilirsiniz:

sudo gem install gdata

İpucu: İyi bir ölçüm için mücevherin düzgün bir şekilde yüklendiğini doğrulamak amacıyla gem list --local çalıştırın.

Kimlik doğrulama

ClientLogin

ClientLogin, uygulamanızın kullanıcılara Google veya G Suite hesaplarına programlı bir şekilde giriş yapmasına olanak tanır. Google, kullanıcının kimlik bilgilerini doğruladıktan sonra, sonraki API isteklerinde başvurulabilecek bir Auth jetonu yayınlar. Bu jeton, çalıştığınız Google hizmeti tarafından tanımlanan belirli bir süre geçerlidir. Güvenlik nedeniyle ve kullanıcılarınıza en iyi deneyimi sunmak için ClientLogin'i yalnızca yüklü masaüstü uygulamaları geliştirirken kullanmalısınız. Web uygulamalarında AuthSub veya OAuth kullanılması tercih edilir.

Yakut kitaplığının her API'si için bir istemci sınıfı vardır. Örneğin, Belge Listesi Veri API'sine giriş yapmak için aşağıdaki kod snippet'ini kullanın: user@gmail.com

client = GData::Client::DocList.new
client.clientlogin('user@gmail.com', 'pa$$word')

The YouTube Data API would be:

client = GData::Client::YouTube.new
client.clientlogin('user@gmail.com', 'pa$$word')

Uygulanan hizmet sınıflarının tam listesini inceleyin. Bir hizmetin istemci sınıfı yoksa GData::Client::Base sınıfını kullanın. Örneğin, aşağıdaki kod kullanıcıları G Suite hesabıyla giriş yapmaya zorlar.

client_login_handler = GData::Auth::ClientLogin.new('writely', :account_type => 'HOSTED')
token = client_login_handler.get_token('user@example.com', 'pa$$word', 'google-RailsArticleSample-v1')
client = GData::Client::Base.new(:auth_handler => client_login_handler)

Not: accountType için varsayılan olarak kitaplık HOSTED_OR_GOOGLE kullanılır. Olası değerler HOSTED_OR_GOOGLE, HOSTED veya GOOGLE'dir.

ClientLogin'i kullanmanın dezavantajlarından biri, başarısız giriş denemelerinde uygulamanıza CAPTCHA sorgulamalarının gönderilebilmesidir. Böyle bir durumda clientlogin() yöntemini ek parametreleriyle çağırarak hatayı giderebilirsiniz: client.clientlogin(username, password, captcha_token, captcha_answer). CAPTCHA'ları yönetmeyle ilgili daha fazla bilgi için Yüklü Uygulamalar İçin Kimlik Doğrulama dokümanlarının tümüne bakın.

AuthSub

AuthSubRequest URL'si Oluşturma

scope = 'http://www.google.com/calendar/feeds/'
next_url = 'http://example.com/change/to/your/app'
secure = false  # set secure = true for signed AuthSub requests
sess = true
authsub_link = GData::Auth::AuthSub.get_url(next_url, scope, secure, sess)

Önceki kod bloğu authsub_link içinde şu URL'yi oluşturur:

https://www.google.com/accounts/AuthSubRequest?next=http%3A%2F%2Fexample.com%2Fchange%2Fto%2Fyour%2Fapp&scope=http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2F&session=1&secure=0

İstemci nesnesinin authsub_url yöntemini de kullanabilirsiniz. Her hizmet sınıfı varsayılan bir authsub_scope özelliği ayarladığından, kendi hizmet sınıfınızı belirtmeniz gerekmez.

client = GData::Client::DocList.new
next_url = 'http://example.com/change/to/your/app'
secure = false  # set secure = true for signed AuthSub requests
sess = true
domain = 'example.com'  # force users to login to a G Suite hosted domain
authsub_link = client.authsub_url(next_url, secure, sess, domain)

Önceki kod bloğu aşağıdaki URL'yi oluşturur:

https://www.google.com/accounts/AuthSubRequest?next=http%3A%2F%2Fexample.com%2Fchange%2Fto%2Fyour%2Fapp&scope=http%3A%2F%2Fdocs.google.com%2Ffeeds%2F&session=1&secure=0&hd=example.com

Tek kullanımlık jetonu oturum jetonuna yükseltme

AuthSub, verilerine erişim izni veren kullanıcıyı http://example.com/change/to/your/app?token=SINGLE_USE_TOKEN uygulamasına yeniden yönlendirir. URL'nin yalnızca tek kullanımlık jeton olarak, sorgu parametresi olarak eklenmiş next_url olduğuna dikkat edin.

Ardından, tek kullanımlık jetonu uzun ömürlü bir oturum jetonuyla değiştirin:

client.authsub_token = params[:token] # extract the single-use token from the URL query params
session[:token] = client.auth_handler.upgrade()
client.authsub_token = session[:token] if session[:token]

Güvenli AuthSub çok benzerdir. Tek değişiklik, jetonu yeni sürüme geçirmeden önce özel anahtarınızı ayarlamaktır:

PRIVATE_KEY = '/path/to/private_key.pem'

client.authsub_token = params[:token]
client.authsub_private_key = PRIVATE_KEY
session[:token] = client.auth_handler.upgrade()
client.authsub_token = session[:token] if session[:token]

Not: Güvenli jetonlar kullanmak için tek kullanımlık jeton isterken secure=true'i ayarlayın. Yukarıdaki AuthSubRequest URL'sini oluşturma bölümüne bakın.

Jeton yönetimi

AuthSub, jetonları yönetmek için AuthSubTokenInfo ve AuthSubCancelToken olmak üzere iki ek işleyici sağlar. AuthSubTokenInfo, bir jetonun geçerliliğini kontrol etmek için yararlıdır. AuthSubRevokeToken, kullanıcıların verilerine erişimi durdurma seçeneği sunar. Uygulamanızda en iyi uygulama olarak AuthSubRevokeToken kullanılmalıdır. Her iki yöntem de kitaplıkta desteklenir.

Bir jetonun meta verilerini sorgulamak için:

client.auth_handler.info

Oturum jetonunu iptal etmek için:

client.auth_handler.revoke

AuthSub'ın tamamını öğrenmek için AuthSub Authentication for Web Application (Web Uygulamaları İçin AuthSub Kimlik Doğrulaması) dokümanına bakın.

OAuth

Bu makale yazılırken OAuth, GData::Auth modülüne eklenmedi.

Yardımcı program kitaplığında OAuth kullanmak, Rails oauth-plugin veya Ruu oauth gem kullanırken nispeten basit olmalıdır. Her iki durumda da bir GData::HTTP::Request nesnesi oluşturup her kitaplık tarafından oluşturulan Authorization üstbilgisini iletmek istersiniz.

Feed'lere erişme

GET (veriler getiriliyor)

Bir istemci nesnesi oluşturduktan sonra, Google Veri feed'ini sorgulamak için get() yöntemini kullanın. XPath belirli Atom öğelerini almak için kullanılabilir. Bir kullanıcının Google Dokümanlarını alma ile ilgili bir örneği burada bulabilirsiniz:

feed = client.get('http://docs.google.com/feeds/documents/private/full').to_xml

feed.elements.each('entry') do |entry|
  puts 'title: ' + entry.elements['title'].text
  puts 'type: ' + entry.elements['category'].attribute('label').value
  puts 'updated: ' + entry.elements['updated'].text
  puts 'id: ' + entry.elements['id'].text
  
  # Extract the href value from each <atom:link>
  links = {}
  entry.elements.each('link') do |link|
    links[link.attribute('rel').value] = link.attribute('href').value
  end
  puts links.to_s
end

POST (yeni veri oluşturma)

Sunucuda yeni veriler oluşturmak için bir istemcinin post() yöntemini kullanın. Aşağıdaki örnekte, new_writer@example.com kimliği doc_id olan dokümana ortak çalışan olarak eklenecektir.

# Return documents the authenticated user owns
feed = client.get('http://docs.google.com/feeds/documents/private/full/-/mine').to_xml
entry = feed.elements['entry']  # first <atom:entry>

acl_entry = <<-EOF
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gAcl='http://schemas.google.com/acl/2007'>
  <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/acl/2007#accessRule'/>
  <gAcl:role value='writer'/>
  <gAcl:scope type='user' value='new_writer@example.com'/>
</entry>
EOF

# Regex the document id out from the full <atom:id>.
# http://docs.google.com/feeds/documents/private/full/document%3Adfrk14g25fdsdwf -> document%3Adfrk14g25fdsdwf
doc_id = entry.elements['id'].text[/full\/(.*%3[aA].*)$/, 1]
response = client.post("http://docs.google.com/feeds/acl/private/full/#{doc_id}", acl_entry)

PUT (veriler güncelleniyor)

Sunucudaki verileri güncellemek için istemcinin put() yöntemini kullanın. Aşağıdaki örnekte bir dokümanın başlığı güncellenecektir. Önceki sorgudan bir feed'iniz olduğunu varsayar.

entry = feed.elements['entry'] # first <atom:entry>

# Update the document's title
entry.elements['title'].text = 'Updated title'
entry.add_namespace('http://www.w3.org/2005/Atom')
entry.add_namespace('gd','http://schemas.google.com/g/2005')

edit_uri = entry.elements["link[@rel='edit']"].attributes['href']
response = client.put(edit_uri, entry.to_s)

SİL

Sunucudan bir <atom:input> veya başka veriler silmek için delete() yöntemini kullanın. Aşağıdaki örnekte bir doküman silinecektir. Kod, önceki bir sorgudan alınmış bir belge girişiniz olduğunu varsayar.

entry = feed.elements['entry'] # first <atom:entry>
edit_uri = entry.elements["link[@rel='edit']"].attributes['href']
client.headers['If-Match'] = entry.attribute('etag').value  # make sure we don't nuke another client's updates
client.delete(edit_uri)

Yeni bir Rails uygulaması oluşturma

Yeni bir Rails uygulaması oluşturma sürecinin ilk adımı genellikle MVC dosyalarınızı oluşturmak için iskele oluşturucuları çalıştırmaktır. Bu adımdan sonra veritabanı tablolarınızı oluşturmak için rake db:migrate çalışıyor. Ancak, uygulamamız Google Dokümanlar Listesi API'sını veri açısından sorgulayacağından, genel yapı iskelelerine veya veritabanlarına çok az ihtiyacımız vardır. Bunun yerine yeni bir uygulama ve basit bir kumanda oluşturun:

rails doclist
cd doclist
ruby script/generate controller doclist

ve config/environment.rb hesabında aşağıdaki değişiklikleri yapın:

config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
config.gem 'gdata', :lib => 'gdata'

İlk satır ActiveRecord ile uygulamanın bağlantısını kesiyor. İkinci satır, başlangıçta gdata mücevheri yükler.

Son olarak, varsayılan rotayı ("/") DoclistController içindeki documents işlemine bağlamayı seçtim. Şu satırı config/routes.rb ekleyin:

map.root :controller => 'doclist', :action => 'all'

Kumanda başlatın

Yapı iskelesi oluşturmadığımızdan app/controllers/doclist_controller.rb içindeki DoclistController için manuel olarak "all" adlı bir işlem ekleyin.

class DoclistController < ApplicationController
  def all
    @foo = 'I pity the foo!'
  end
end

ve app/views/doclist/ altında all.html.erb oluştur:

<%= @foo %>

Web sunucusunu çalıştırıp geliştirmeye başlama

Artık ruby script/server yöntemini çağırarak varsayılan web sunucusunu başlatabilmeniz gerekir. Her şey yolundaysa tarayıcınızı http://localhost:3000/ adresine yönlendirerek "I pity the foo!" mesajını gösterin.

İpucu: public/index.html adlı kullanıcıyı kaldırmayı veya yeniden adlandırmayı unutmayın.

Bu işlemi tamamladıktan sonra DocList Manager projesinin son halini görmek için son DoclistController ve ApplicationController ürünlerine göz atın. Ayrıca, Google Contacts API'ye yapılan çağrıları işleyen ContactsController adlı cihaza da göz atmak isteyebilirsiniz.

Sonuç

Google Data Rails uygulaması oluşturmanın en zor kısmı Rails'i yapılandırmaktır! Ancak, çok kısa bir süre içinde uygulamanızı dağıtacaksınız. Bunun için Apache için mod_rails kullanmanızı kesinlikle öneririz. Kurulumu, yüklenmesi ve çalıştırılması son derece kolaydır. Kısa süre içinde reklam yayınlamaya başlayabilirsiniz.

Kaynaklar

Ek

Örnekler

DocList Manager, bu makalede ele alınan konuları gösteren eksiksiz bir Roku on Rails örneğidir. Tam kaynak koduna proje barındırmadan erişebilirsiniz.