Ş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
- Google Veri API'lerinin listesi
- Google Veri Yakut Yardımcı Programı Kitaplığı proje sayfası
- Makale: Ruby'yi Google Veri API'leriyle kullanma
- Ruet'i indirin
- RugarGems ve Rails'i indirin
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.