Data Google di Kereta Api

Eric Bidelman, Tim Google Data API
Februari 2009

Pengantar

"Di mana Ruby ada dalam daftar library klien?"

Termotivasi oleh selera developer kami yang ganas dan popularitas Ruby on Rails (RoR) yang berkelanjutan, kolega saya, Jeff Fisher, telah memalsukan library utilitas Ruby dari kedalaman Mount Doom yang berapi-api. Perlu diperhatikan bahwa ini bukanlah library klien yang lengkap, tetapi library ini menangani dasar-dasar seperti autentikasi dan manipulasi XML dasar. Hal ini juga mengharuskan Anda bekerja langsung dengan feed Atom menggunakan modul REXML dan XPath.

Audiens

Artikel ini ditujukan bagi developer yang tertarik mengakses Google Data API menggunakan Ruby, khususnya Ruby on Rails. Ini mengasumsikan bahwa pembaca memiliki beberapa pengetahuan tentang bahasa pemrograman Ruby dan framework pengembangan web Rails. Saya berfokus pada Document List API untuk sebagian besar contoh, tetapi konsep yang sama dapat diterapkan ke semua API Data.

Memulai

Persyaratan

Menginstal Library Utilitas Ruby Data Google

Untuk mendapatkan library, Anda dapat mendownload sumber library langsung dari hosting project atau menginstal gem:

sudo gem install gdata

Tips: Untuk mengukur dengan baik, jalankan gem list --local untuk memverifikasi bahwa permata telah diinstal dengan benar.

Autentikasi

ClientLogin

ClientLogin memungkinkan aplikasi Anda membuat pengguna login secara terprogram ke akun Google atau G Suite mereka. Setelah memvalidasi kredensial pengguna, Google akan menerbitkan token Auth untuk direferensikan dalam permintaan API berikutnya. Token tetap valid selama jangka waktu tertentu, yang ditentukan oleh layanan Google mana pun yang Anda gunakan. Untuk alasan keamanan dan untuk memberikan pengalaman terbaik kepada pengguna, Anda hanya boleh menggunakan ClientLogin saat mengembangkan aplikasi desktop terinstal. Untuk aplikasi web, sebaiknya gunakan AuthSub atau OAuth.

Library Ruby memiliki class klien untuk setiap API. Misalnya, gunakan cuplikan kode berikut untuk login ke user@gmail.com ke Document List Data API:

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')

Lihat daftar lengkap class layanan yang diterapkan. Jika layanan tidak memiliki class klien, gunakan class GData::Client::Base. Sebagai contoh, kode berikut memaksa pengguna untuk login dengan akun G Suite.

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)

Catatan: Secara default, library menggunakan HOSTED_OR_GOOGLE untuk accountType. Nilai yang mungkin adalah HOSTED_OR_GOOGLE, HOSTED, atau GOOGLE.

Salah satu kelemahan menggunakan ClientLogin adalah aplikasi Anda dapat dikirimi verifikasi CAPTCHA pada upaya login yang gagal. Jika itu terjadi, Anda dapat menangani error dengan memanggil metode clientlogin() dengan parameter tambahannya: client.clientlogin(username, password, captcha_token, captcha_answer). Baca dokumentasi Autentikasi lengkap untuk Aplikasi yang Diinstal untuk mendapatkan informasi lebih lanjut tentang penanganan CAPTCHA.

AuthSub

Membuat URL AuthSubRequest

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)

Blok kode sebelumnya membuat URL berikut di authsub_link:

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

Anda juga dapat menggunakan metode authsub_url dari objek klien. Setiap class layanan telah menetapkan atribut authsub_scope default sehingga Anda tidak perlu menentukan atribut Anda sendiri.

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)

Blok kode sebelumnya membuat URL berikut:

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

Mengupgrade token sekali pakai ke token sesi

AuthSub akan mengalihkan pengguna kembali ke http://example.com/change/to/your/app?token=SINGLE_USE_TOKEN setelah mereka memberikan akses ke data mereka. Perhatikan bahwa URL tersebut hanyalah next_url dengan token sekali pakai yang ditambahkan sebagai parameter kueri.

Berikutnya, tukarkan token sekali pakai dengan token sesi yang tahan lama:

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]

AuthSub Secure sangat mirip. Satu-satunya penambahan adalah menyetel kunci pribadi Anda sebelum mengupgrade token:

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]

Catatan: Untuk menggunakan token aman, pastikan untuk menetapkan secure=true saat meminta token sekali pakai. Lihat Membuat URL AuthSubRequest di atas.

Pengelolaan token

AuthSub menyediakan dua pengendali tambahan, AuthSubTokenInfo dan AuthSub UnplugToken untuk mengelola token. AuthSubTokenInfo berguna untuk memeriksa validitas token. AuthSubRevokeToken memberi pengguna opsi untuk menghentikan akses ke data mereka. Aplikasi Anda harus menggunakan AuthSubRevokeToken sebagai praktik terbaik. Kedua metode ini didukung di library Ruby.

Untuk membuat kueri metadata token:

client.auth_handler.info

Untuk mencabut token sesi:

client.auth_handler.revoke

Lihat dokumentasi lengkap Autentikasi AuthSub untuk Aplikasi Web untuk mendapatkan informasi lengkap tentang AuthSub.

OAuth

Pada saat artikel ini ditulis, OAuth belum ditambahkan ke modul GData::Auth.

Penggunaan OAuth di library utilitas seharusnya relatif sederhana saat menggunakan oauth-plugin Rails atau permata OAuth Ruby. Dalam kedua kasus tersebut, Anda dapat membuat objek GData::HTTP::Request dan meneruskan header Authorization yang dihasilkan oleh setiap library.

Mengakses feed

GET (mengambil data)

Setelah Anda menyiapkan objek klien, gunakan metode get()-nya untuk membuat kueri feed Data Google. XPath dapat digunakan untuk mengambil elemen Atom tertentu. Berikut adalah contoh pengambilan Google Dokumen pengguna:

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 (membuat data baru)

Gunakan metode post() klien untuk membuat data baru di server. Contoh berikut akan menambahkan new_writer@example.com sebagai kolaborator ke dokumen dengan ID: doc_id.

# 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 (memperbarui data)

Untuk memperbarui data di server, gunakan metode put() klien. Contoh berikut akan memperbarui judul dokumen. Diasumsikan bahwa Anda memiliki feed dari kueri sebelumnya.

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)

HAPUS

Untuk menghapus <atom:entri> atau data lainnya dari server, gunakan metode delete(). Contoh berikut akan menghapus dokumen. Kode ini mengasumsikan bahwa Anda memiliki entri dokumen dari kueri sebelumnya.

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)

Membuat aplikasi Rails baru

Biasanya, latihan pertama dalam membuat aplikasi Rel baru adalah menjalankan scaffold generator untuk membuat file MVC. Setelah itu, aplikasi akan menjalankan rake db:migrate untuk menyiapkan tabel database Anda. Namun, karena aplikasi kita akan membuat kueri untuk API Daftar Dokumen Google untuk data, kita tidak terlalu memerlukan scaffolding atau database umum. Sebagai gantinya, buat aplikasi baru dan pengontrol sederhana:

rails doclist
cd doclist
ruby script/generate controller doclist

dan lakukan perubahan berikut pada config/environment.rb:

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

Baris pertama melepaskan ActiveRecord dari aplikasi. Baris kedua memuat gem gdata saat memulai.

Terakhir, saya memilih menghubungkan rute default ('/') dengan tindakan documents di DoclistController. Tambahkan baris ini ke config/routes.rb:

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

Memulai pengontrol

Karena kita tidak membuat scaffolding, tambahkan tindakan secara manual bernama 'all' ke DoclistController di app/controllers/doclist_controller.rb.

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

dan buat all.html.erb di bagian app/views/doclist/:

<%= @foo %>

Mengaktifkan server web & amp; memulai pengembangan

Anda sekarang dapat memulai server web default dengan memanggil ruby script/server. Jika tidak ada masalah, mengarahkan browser ke http://localhost:3000/ akan menampilkan 'I pity the foo!'.

Tips: Jangan lupa untuk menghapus atau mengganti nama public/index.html.

Setelah semuanya berfungsi, lihat bagian akhir DoclistController dan ApplicationController untuk mengetahui project Project DocList Manager. Anda juga dapat melihat ContactsController, yang menangani panggilan ke Google Contacts API.

Kesimpulan

Bagian tersulit dari membuat aplikasi Google Data Rails adalah mengonfigurasi Rails! Namun, detik kedua adalah men-deploy aplikasi Anda. Untuk itu, saya sangat merekomendasikan mod_rails untuk Apache. Penyiapan, penginstalan, dan pengoperasiannya sangat mudah. Anda akan siap dan mulai bekerja dalam waktu singkat!

Resource

Lampiran

Contoh

DocList Manager adalah contoh lengkap Ruby on Rails yang menunjukkan topik yang dibahas dalam artikel ini. Kode sumber lengkap tersedia dari hosting project.