atompub, ruby y la api de 11870
DESCRIPTION
TRANSCRIPT
Atom Publishing Protocol, ruby y la api de 11870.com
David Calavera
antecedentes
T David Calavera Conferencia Rails 2007
11870.com
๏ recuerda y comparte negocios ...
T David Calavera Conferencia Rails 2007
11870.com
• recuerda y comparte negocios ...
๏ no solo de comentarios vive el hombre
T David Calavera Conferencia Rails 2007
11870.com
• recuerda y comparte negocios ...
• no solo de comentarios vive el hombre
๏ ¿por qué tengo que atarme a la web?
T David Calavera Conferencia Rails 2007
11870.com
• recuerda y comparte negocios ...
• no solo de comentarios vive el hombre
• ¿por qué tengo que atarme a la web?
๏ ¿quien tiene que adaptarse?
atomPub
T David Calavera Conferencia Rails 2007
“the atom publishing protocol is an application-level protocol for publishing and editing web resources”
T David Calavera Conferencia Rails 2007
๏ ¿sabes qué es HTTP y como usarlo?
T David Calavera Conferencia Rails 2007
• ¿sabes qué es HTTP y como usarlo?
๏ ¿sabes qué es XML y como usarlo?
T David Calavera Conferencia Rails 2007
• ¿sabes qué es HTTP y como usarlo?
• ¿sabes qué es XML y como usarlo?
๏ ¿sabes qué es un feed y como crearlo?
atomPub características
estándar
http://ietfreport.isoc.org/idref/rfc5023
T David Calavera Conferencia Rails 2007
basado en atom
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> <id>http://www.verbosemode.com/wp-app.php/posts</id> <updated>2007-11-04T11:38:28Z</updated> <title type="text">Verbose mode</title> <subtitle type="text">Verbose mode</subtitle> <entry> <id>http://www.verbosemode.com/?p=3</id> <title type="text">Spanish Rails Conf 07</title> <updated>2007-11-04T11:38:28Z</updated> <published>2007-11-04T11:38:28Z</published> ...
arquitectura REST
T David Calavera Conferencia Rails 2007
arquitectura REST
๏ protocolo sin estado
T David Calavera Conferencia Rails 2007
arquitectura REST
• protocolo sin estado
๏ operaciones bien definidas
T David Calavera Conferencia Rails 2007
arquitectura REST
• protocolo sin estado
• operaciones bien definidas
๏ sintaxis universal (IRI)
T David Calavera Conferencia Rails 2007
IRI
T David Calavera Conferencia Rails 2007
www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp
URI
T David Calavera Conferencia Rails 2007
www.%e3%81%bb%e3%82%93%e3%81%a8%e3%81%86%e3%81%ab%e3%81%aa%e3%81%8c%e3%81%84%e3%82%8f%e3%81%91%e3%81%ae%e3%82%8f%e3%81%8b%e3%82%89%e3%81%aa%e3%81%84%e3%81%a9%e3%82%81%e3%81%84%e3%82%93%e3%82%81%e3%81%84%e3%81%ae%e3%82%89%e3%81%b9%e3%82%8b%e3%81%be%e3%81%a0%e3%81%aa%e3%81%8c%e3%81%8f%e3%81%97%e3%81%aa%e3%81%84%e3%81%a8%e3%81%9f%e3%82%8a%e3%81%aa%e3%81%84.w3.mag.keio.ac.jp
introspectivo
T David Calavera Conferencia Rails 2007
introspectivo
documento de servicio
T David Calavera Conferencia Rails 2007
introspectivo
documento de servicio
colección
colección
T David Calavera Conferencia Rails 2007
introspectivo
documento de servicio
colección
elementos
colección
elementos
T David Calavera Conferencia Rails 2007
fácilmente extensible
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"> <id>http://www.verbosemode.com/wp-app.php/posts</id> <updated>2007-11-04T11:38:28Z</updated> <title type="text">Verbose mode</title> <subtitle type="text">Verbose mode</subtitle> <openSearch:totalResults>1</openSearch:totalResults> <openSearch:startIndex>1</openSearch:startIndex> <openSearch:itemsPerPage>25</openSearch:itemsPerPage> <entry> <id>http://www.verbosemode.com/?p=3</id> <title type="text">Spanish Rails Conf 07</title> <updated>2007-11-04T11:38:28Z</updated> <published>2007-11-04T11:38:28Z</published> ...
multimedia
T David Calavera Conferencia Rails 2007
más...
๏ paginación
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> <id>http://www.verbosemode.com/wp-app.php/posts</id> <updated>2007-11-04T11:38:28Z</updated> <link rel="self" href="http://www.verbosemode.com/wp-app.php/posts?p=3"/> <link rel="next" href="http://www.verbosemode.com/wp-app.php/posts?p=4"/> <link rel="previous" href="http://www.verbosemode.com/wp-app.php/posts?p=2"/> <link rel="first" href="http://www.verbosemode.com/wp-app.php/posts"/> <link rel="last" href="http://www.verbosemode.com/wp-app.php/posts?p=5"/> ...
más...
• paginación
๏ caché
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
POST /wp-app.php/postsHTTP/1.1 201 Created Content-Type: application/atom+xml;type=entry;charset="utf-8" ETag: "c180de84f991g8"
T David Calavera Conferencia Rails 2007
POST /wp-app.php/postsHTTP/1.1 201 Created Content-Type: application/atom+xml;type=entry;charset="utf-8" ETag: "c180de84f991g8"
GET /wp-app.php/post/3HTTP/1.1 304 Not Modified If-None-Match: "c180de84f991g8"
T David Calavera Conferencia Rails 2007
POST /wp-app.php/postsHTTP/1.1 201 Created Content-Type: application/atom+xml;type=entry;charset="utf-8" ETag: "c180de84f991g8"
GET /wp-app.php/post/3HTTP/1.1 304 Not Modified If-None-Match: "c180de84f991g8"
PUT /wp-app.php/post/3HTTP/1.1 412 Precondition Failed If-Match: "c180de84f991g8"
más...
• paginación
• caché
๏ control de estado
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:lang="en"> <id>http://www.verbosemode.com/?p=3</id> <title type="text">Spanish Rails Conf 07</title> <app:control> <app:draft>no</app:draft> </app:control>...
más...
• paginación
• caché
• control de estado
T David Calavera Conferencia Rails 2007
๏ seguridad
atomPub estructura
atomPub:service
T David Calavera Conferencia Rails 2007
GET 'http://www.verbosemode.com/wp-app.php/service'HTTP/1.1 200 OK
atomPub:service
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Workspace</atom:title> <collection href="http://www.verbosemode.com/wp-app.php/posts"> <atom:title>Posts</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="http://www.verbosemode.com/wp-app.php/categories"/> </collection> <collection href="http://www.verbosemode.com/wp-app.php/attachments"> <atom:title>Media</atom:title> <accept>image/*</accept> <accept>audio/*</accept> <accept>video/*</accept> </collection> </workspace></service>
atomPub:service
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Workspace</atom:title> <collection href="http://www.verbosemode.com/wp-app.php/posts"> <atom:title>Posts</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="http://www.verbosemode.com/wp-app.php/categories"/> </collection> <collection href="http://www.verbosemode.com/wp-app.php/attachments"> <atom:title>Media</atom:title> <accept>image/*</accept> <accept>audio/*</accept> <accept>video/*</accept> </collection> </workspace></service>
atomPub:service
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Workspace</atom:title> <collection href="http://www.verbosemode.com/wp-app.php/posts"> <atom:title>Posts</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="http://www.verbosemode.com/wp-app.php/categories"/> </collection> <collection href="http://www.verbosemode.com/wp-app.php/attachments"> <atom:title>Media</atom:title> <accept>image/*</accept> <accept>audio/*</accept> <accept>video/*</accept> </collection> </workspace></service>
atomPub:service
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Workspace</atom:title> <collection href="http://www.verbosemode.com/wp-app.php/posts"> <atom:title>Posts</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="http://www.verbosemode.com/wp-app.php/categories"/> </collection> <collection href="http://www.verbosemode.com/wp-app.php/attachments"> <atom:title>Media</atom:title> <accept>image/*</accept> <accept>audio/*</accept> <accept>video/*</accept> </collection> </workspace></service>
atomPub:service
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Workspace</atom:title> <collection href="http://www.verbosemode.com/wp-app.php/posts"> <atom:title>Posts</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="http://www.verbosemode.com/wp-app.php/categories"/> </collection> <collection href="http://www.verbosemode.com/wp-app.php/attachments"> <atom:title>Media</atom:title> <accept>image/*</accept> <accept>audio/*</accept> <accept>video/*</accept> </collection> </workspace></service>
atomPub:categories
T David Calavera Conferencia Rails 2007
GET 'http://www.verbosemode.com/wp-app.php/categories'HTTP/1.1 200 OK
atomPub:categories
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><app:categories xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2005/Atom" fixed="yes" scheme="http://www.verbosemode.com"> <category term="atomPub" /> <category term="rails" /></app:categories>
atomPub:collection
T David Calavera Conferencia Rails 2007
GET 'http://www.verbosemode.com/wp-app.php/posts'HTTP/1.1 200 OK
POST 'http://www.verbosemode.com/wp-app.php/posts'HTTP/1.1 201 CreatedContent-Type: */*Location: 'http://www.verbosemode.com/wp-app.php/post/3'Content-Location: 'http://www.verbosemode.com/wp-app.php/post/3'
atomPub:collection
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:lang="en"> <id>http://www.verbosemode.com/wp-app.php/posts</id> <updated>2007-11-04T11:38:28Z</updated> <title type="text">Verbose mode</title> <link rel="first" href="http://www.verbosemode.com/wp-app.php/posts"/> <link rel="last" href="http://www.verbosemode.com/wp-app.php/posts"/> <link rel="self" href="http://www.verbosemode.com/wp-app.php/posts"/> <entry> <id>http://www.verbosemode.com/?p=3</id> <title type="text">Spanish Rails Conf 07</title> <app:edited>2007-11-04T11:38:28Z</app:edited> <link rel="edit" href="http://www.verbosemode.com/wp-app.php/post/3"/> <app:control><app:draft>no</app:draft></app:control> ...
atomPub:collection
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:lang="en"> <id>http://www.verbosemode.com/wp-app.php/posts</id> <updated>2007-11-04T11:38:28Z</updated> <title type="text">Verbose mode</title> <link rel="first" href="http://www.verbosemode.com/wp-app.php/posts"/> <link rel="last" href="http://www.verbosemode.com/wp-app.php/posts"/> <link rel="self" href="http://www.verbosemode.com/wp-app.php/posts"/> <entry> <id>http://www.verbosemode.com/?p=3</id> <title type="text">Spanish Rails Conf 07</title> <app:edited>2007-11-04T11:38:28Z</app:edited> <link rel="edit" href="http://www.verbosemode.com/wp-app.php/post/3"/> <app:control><app:draft>no</app:draft></app:control> ...
atomPub:collection
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:lang="en"> <id>http://www.verbosemode.com/wp-app.php/posts</id> <updated>2007-11-04T11:38:28Z</updated> <title type="text">Verbose mode</title> <link rel="first" href="http://www.verbosemode.com/wp-app.php/posts"/> <link rel="last" href="http://www.verbosemode.com/wp-app.php/posts"/> <link rel="self" href="http://www.verbosemode.com/wp-app.php/posts"/> <entry> <id>http://www.verbosemode.com/?p=3</id> <title type="text">Spanish Rails Conf 07</title> <app:edited>2007-11-04T11:38:28Z</app:edited> <link rel="edit" href="http://www.verbosemode.com/wp-app.php/post/3"/> <app:control><app:draft>no</app:draft></app:control> ...
atomPub:entry
T David Calavera Conferencia Rails 2007
GET 'http://www.verbosemode.com/wp-app.php/post/3'HTTP/1.1 200 OK
PUT 'http://www.verbosemode.com/wp-app.php/post/3'HTTP/1.1 204 No ContentContent-Type: application/atom+xml;type=entry
DELETE 'http://www.verbosemode.com/wp-app.php/post/3'HTTP/1.1 200 OK
atomPub:entry
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="utf-8"?><entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:lang="en"> <id>http://www.verbosemode.com/?p=3</id> <title type="text">Spanish Rails Conf 07</title> <updated>2007-11-04T15:43:49Z</updated> <published>2007-11-04T11:38:28Z</published> <app:edited>2007-11-04T15:43:49Z</app:edited> <app:control><app:draft>no</app:draft></app:control> <author><name>david</name></author> <content type="xhtml"><div xmlns='http://www.w3.org/1999/xhtml'> Next November 22 and 23 I'm going to attend to ...</div></content> <link rel="edit" href="http://www.verbosemode.com/wp-app.php/post/3" /> <category scheme="http://www.verbosemode.com" term="atomPub" /> <category scheme="http://www.verbosemode.com" term="rails" /> <summary type="text">Next November 22 and 23 I’m ...</summary></entry>
atomPub:entry
T David Calavera Conferencia Rails 2007
¿y... qué pasa con los otros tipos de recursos?
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:lang="en"> <id>http://www.verbosemode.com/wp-content/uploads/2007/11/avatar.png</id> <title type="text">avatar poster</title> <updated>2007-11-13T21:59:55Z</updated> <published>2007-11-13T21:59:55Z</published> <app:edited>2007-11-13T21:59:55Z</app:edited> <app:control><app:draft>no</app:draft></app:control> <author><name>david</name></author> <link rel="edit-media" href="http://www.verbosemode.com/wp-app.php/attachment/file/4" /> <link rel="edit" href="http://www.verbosemode.com/wp-app.php/post/4" /> <content type="image/png" src="http://www.verbosemode.com/wp-content/uploads/2007/11/avatar.png"/></entry>
atomPub:entry
T David Calavera Conferencia Rails 2007
¿y... qué pasa con los otros tipos de recursos?
GET 'http://www.verbosemode.com/wp-app.php/attachment/file/4'HTTP/1.1 200 OK
PUT 'http://www.verbosemode.com/wp-app.php/attachment/file/4'HTTP/1.1 204 No ContentContent-Type: */*
DELETE 'http://www.verbosemode.com/wp-app.php/attachment/file/4'HTTP/1.1 200 OK
atomPub ¿pero... hay gente que usa esto?
๏ google: gdata, youtube, openSocial
T David Calavera Conferencia Rails 2007
๏ microsoft: windows live writer
• google: gdata, youtube, openSocial
T David Calavera Conferencia Rails 2007
๏ ibm: lotus connections
• microsoft: windows live writer
• google: gdata, youtube, openSocial
T David Calavera Conferencia Rails 2007
• ibm: lotus connections
๏ wordpress
• microsoft: windows live writer
• google: gdata, youtube, openSocial
T David Calavera Conferencia Rails 2007
• ibm: lotus connections
• wordpress
๏ nokia: liveblog
• microsoft: windows live writer
• google: gdata, youtube, openSocial
T David Calavera Conferencia Rails 2007
• ibm: lotus connections
• wordpress
• nokia: liveblog
• microsoft: windows live writer
• google: gdata, youtube, openSocial
๏ six apart: typepad, movable type
T David Calavera Conferencia Rails 2007
• ibm: lotus connections
• wordpress
• nokia: liveblog
• microsoft: windows live writer
• google: gdata, youtube, openSocial
• six apart: typepad, movable type
๏ 11870.com
ruby sin más
Net::HTTP
T David Calavera Conferencia Rails 2007
Net::HTTP
๏ fácil de mantener
T David Calavera Conferencia Rails 2007
Net::HTTP
• fácil de mantener
๏ respuesta condicionada al estado
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
HTTPResponse HTTPSuccess # 2xx HTTPOK # 200 HTTPCreated # 201 HTTPRedirection # 3xx HTTPNotModified # 304 HTTPClientError # 4xx HTTPBadRequest # 400 HTTPUnauthorized # 401 HTTPForbidden # 403 HTTPNotFound # 404 HTTPPreconditionFailed # 412 HTTPUnsupportedMediaType # 415 HTTPServerError # 5xx HTTPInternalServerError # 500
Net:HTTP
• fácil de mantener
• respuesta condicionada al estado
T David Calavera Conferencia Rails 2007
๏ no sabe si estoy en una capa segura
T David Calavera Conferencia Rails 2007
require 'net/http'require 'net/https'
@uri = 'https://registro.conferenciarails.org'http = Net::HTTP.new @urihttp.use_ssl = true if @uri =~ /^https/
los cuatro verbos http
Net::HTTP.start(@uri.host, @uri.port) do |http|end
T David Calavera Conferencia Rails 2007
los cuatro verbos http
Net::HTTP.start(@uri.host, @uri.port) do |http| #POST http.request Net::HTTP::Post.new(@uri.path), dataend
T David Calavera Conferencia Rails 2007
los cuatro verbos http
Net::HTTP.start(@uri.host, @uri.port) do |http| #POST http.request Net::HTTP::Post.new(@uri.path), data #GET http.request Net::HTTP::Get.new(@uri.path)end
T David Calavera Conferencia Rails 2007
los cuatro verbos http
Net::HTTP.start(@uri.host, @uri.port) do |http| #POST http.request Net::HTTP::Post.new(@uri.path), data #GET http.request Net::HTTP::Get.new(@uri.path) #PUT http.request Net::HTTP::Put.new(@uri.path), dataend
T David Calavera Conferencia Rails 2007
los cuatro verbos http
Net::HTTP.start(@uri.host, @uri.port) do |http| #POST http.request Net::HTTP::Post.new(@uri.path), data #GET http.request Net::HTTP::Get.new(@uri.path) #PUT http.request Net::HTTP::Put.new(@uri.path), data #DELETE http.request Net::HTTP::Delete.new(@uri.path)end
T David Calavera Conferencia Rails 2007
REXML
๏ parser completo
T David Calavera Conferencia Rails 2007
REXML
• parser completo
๏ escrito completamente en ruby
T David Calavera Conferencia Rails 2007
REXML
• parser completo
• escrito completamente en ruby
T David Calavera Conferencia Rails 2007
๏ pasa los test de aceptación de Oasis
REXML
• parser completo
• escrito completamente en ruby
T David Calavera Conferencia Rails 2007
• pasa los test de aceptación de Oasis
๏ soporta XPath
REXML y xpath
T David Calavera Conferencia Rails 2007
NS = {'atom' => 'http://www.w3.org/2005/Atom', 'app' => 'http://www.w3.org/2007/app', 'georss' => 'http://www.georss.org/georss/10', 'gml' => 'http://www.opengis.net/gml'}
REXML::XPath.each( feed.root, './atom:entry', NS) do |entry| title = REXML::XPath.first(entry, './atom:title/text()', NS) edited = REXML::XPath.first(entry, './app:edited/text()', NS) pos = REXML::XPath.first(entry, './georss:where/gml:Point/gml:pos/text()', NS)end
REXML y xpath
T David Calavera Conferencia Rails 2007
NS = {'atom' => 'http://www.w3.org/2005/Atom', 'app' => 'http://www.w3.org/2007/app', 'georss' => 'http://www.georss.org/georss/10', 'gml' => 'http://www.opengis.net/gml'}
REXML::XPath.each( feed.root, './atom:entry', NS) do |entry| title = REXML::XPath.first(entry, './atom:title/text()', NS) edited = REXML::XPath.first(entry, './app:edited/text()', NS) pos = REXML::XPath.first(entry, './georss:where/gml:Point/gml:pos/text()', NS)end
REXML y xpath
T David Calavera Conferencia Rails 2007
NS = {'atom' => 'http://www.w3.org/2005/Atom', 'app' => 'http://www.w3.org/2007/app', 'georss' => 'http://www.georss.org/georss/10', 'gml' => 'http://www.opengis.net/gml'}
REXML::XPath.each( feed.root, './atom:entry', NS) do |entry| title = REXML::XPath.first(entry, './atom:title/text()', NS) edited = REXML::XPath.first(entry, './app:edited/text()', NS) pos = REXML::XPath.first(entry, './georss:where/gml:Point/gml:pos/text()', NS)end
REXML y xpath
T David Calavera Conferencia Rails 2007
NS = {'atom' => 'http://www.w3.org/2005/Atom', 'app' => 'http://www.w3.org/2007/app', 'georss' => 'http://www.georss.org/georss/10', 'gml' => 'http://www.opengis.net/gml'}
REXML::XPath.each( feed.root, './atom:entry', NS) do |entry| title = REXML::XPath.first(entry, './atom:title/text()', NS) edited = REXML::XPath.first(entry, './app:edited/text()', NS) pos = REXML::XPath.first(entry, './georss:where/gml:Point/gml:pos/text()', NS)end
REXML y xpath
T David Calavera Conferencia Rails 2007
NS = {'atom' => 'http://www.w3.org/2005/Atom', 'app' => 'http://www.w3.org/2007/app', 'georss' => 'http://www.georss.org/georss/10', 'gml' => 'http://www.opengis.net/gml'}
REXML::XPath.each( feed.root, './atom:entry', NS) do |entry| title = REXML::XPath.first(entry, './atom:title/text()', NS) edited = REXML::XPath.first(entry, './app:edited/text()', NS) pos = REXML::XPath.first(entry, './georss:where/gml:Point/gml:pos/text()', NS)end
Builder
๏ crea xml fácilmente
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
require 'builder'
builder = Builder::XmlMarkup.new
xml = builder.feed( 'xmlns' => 'http://www.w3.org/2005/Atom' ) do |feed| feed.id 'http://conferenciarails.org/atomPub' feed.updated Time.now feed.author do |author| author.name 'David Calavera' end feed.entry do |entry| entry.title 'entrada para la conferencia rails' endend
Builder
• crea xml fácilmente
๏ no solo se usa con rails
T David Calavera Conferencia Rails 2007
๏ in the beginning... was the command line
T David Calavera Conferencia Rails 2007
builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
• in the beginning... was the command line
T David Calavera Conferencia Rails 2007
builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
๏ vamos de camping
Camping.goes :Atommodule Atom::Views def index html do head do title 'Atom Publishing Protocol @ conferecia rails' end body do ... end endend
ruby extras
atom-tools
๏ parsea y manipula feeds
T David Calavera Conferencia Rails 2007
http://code.necronomicorp.com/atom-tools
atom-tools
• parsea y manipula feeds
T David Calavera Conferencia Rails 2007
๏ adaptado al rfc 5023
http://code.necronomicorp.com/atom-tools
atom-tools
• parsea y manipula feeds
T David Calavera Conferencia Rails 2007
• adaptado al rfc 5023
http://code.necronomicorp.com/atom-tools
๏ abstracción de http y xml
T David Calavera Conferencia Rails 2007
require 'atom-tools'
http = Atom::HTTP.newhttp.user = 'david'http.pass = 'my password'http.always_auth :basic
service = Atom::Service.new 'http://verbosemode.com/wp-app.php/service', http
service.collections.each do |collection| puts collection.acceptsend
T David Calavera Conferencia Rails 2007
require 'atom-tools'
http = Atom::HTTP.newhttp.user = 'david'http.pass = 'my password'http.always_auth :basic
service = Atom::Service.new 'http://verbosemode.com/wp-app.php/service', http
service.collections.each do |collection| puts collection.acceptsend
T David Calavera Conferencia Rails 2007
require 'atom-tools'
http = Atom::HTTP.newhttp.user = 'david'http.pass = 'my password'http.always_auth :basic
service = Atom::Service.new 'http://verbosemode.com/wp-app.php/service', http
service.collections.each do |collection| puts collection.acceptsend
atom_pub_server
๏ rails es REST
T David Calavera Conferencia Rails 2007
http://svn.thinkincode.net/rails/plugins/atom_pub_server
atom_pub_server
• rails es REST
๏ mejor soporte para atom y atomPub
T David Calavera Conferencia Rails 2007
http://svn.thinkincode.net/rails/plugins/atom_pub_server
T David Calavera Conferencia Rails 2007
atom_feed do |feed| feed.title("My great blog!") feed.updated((@posts.first.created_at))
for post in @posts feed.entry(post) do |entry| entry.tag!('georss:where', 'xmlns:georss' => 'http://www.georss.org/georss/10') do |where| where.tag!('gml:Poing', 'xmlns:gml' => 'http://www.opengis.net/gml') do |point| point.tag!('gml:pos', nil, '40.419967 -3.698965') end end
T David Calavera Conferencia Rails 2007
atom_feed({'xmlns:georss' => 'http://www.georss.org/georss/10', 'xmlns:gml' => 'http://www.opengis.net/gml'}) do |feed| feed.title("My great blog!") feed.updated((@posts.first.created_at))
for post in @posts feed.entry(post) do |entry| entry.georss:where do |where| where.gml:Point do |point| point.tag!('gml:pos', '40.419967 -3.698965') end end
atom_pub_server
• rails es REST
• mejor soporte para atom y atomPub
๏ acts_as_collection
T David Calavera Conferencia Rails 2007
http://svn.thinkincode.net/rails/plugins/atom_pub_server
T David Calavera Conferencia Rails 2007
class PostsController < ApplicationController acts_as_collection :title => 'Posts', :workspace => 'Blog', :accept => Mime::ATOM_ENTRY, :href => 'http::/verbosemode.com/atomPub/posts', :categories => [ { :fixed => 'yes', :scheme => 'http://verbosemode.com/tags', :category => [{:term => 'rails'}, {:term => 'plugins'}] }, {:href => 'http://verbosemode.com/mysections'} ] end
atom_pub_server
• rails es REST
• mejor soporte para atom y atomPub
• acts_as_collection
๏ acts_as_service_document
T David Calavera Conferencia Rails 2007
http://svn.thinkincode.net/rails/plugins/atom_pub_server
T David Calavera Conferencia Rails 2007
class ServicesController < ApplicationController acts_as_service_document def index render :xml => service_document endend
the ape
๏ the atom publishing exerciser
http://www.tbray.org/ape
the ape
• the atom publishing exerciser
๏ introspección!!!
T David Calavera Conferencia Rails 2007
http://www.tbray.org/ape
T David Calavera Conferencia Rails 2007
the ape
• the atom publishing exerciser
• introspección!!!
๏ varios sistemas de autenticación
T David Calavera Conferencia Rails 2007
http://www.tbray.org/ape
T David Calavera Conferencia Rails 2007
the ape
• the atom publishing exerciser
๏ no es muy fácil de instalar (de momento)
• introspección!!!
• varios sistemas de autenticación
T David Calavera Conferencia Rails 2007
http://www.tbray.org/ape
the ape
• the atom publishing exerciser
• no es muy fácil de instalar (de momento)
๏ no es muy fácil de configurar (de momento)
• introspección!!!
• varios sistemas de autenticación
T David Calavera Conferencia Rails 2007
http://www.tbray.org/ape
por partes
๏ api de búsqueda
T David Calavera Conferencia Rails 2007
➡ formato openSearch (http://opensearch.org)
T David Calavera Conferencia Rails 2007
<?xml version=" 1.0" encoding="UTF-8"?><service xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.w3.org/2007/app " xml:base="http://11870.com/"> <workspace> <atom:title type="text">11870 workspace</atom:title> <collection href="/api/v1/search"> <atom:title type="text">Search</atom:title> </collection> </workspace></service>
por partes
• api de búsqueda
๏ api de gestión de contenidos
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
<?xml version="1.0" encoding="UTF-8"?><service xmlns:atom="http://www.w3.org/2005/Atom" xmlns=" http://www.w3.org/2007/app" xml:base="http://localhost/"> <workspace> <atom:title type="text">11870 workspace</atom:title> <collection href="/api/v1/sites/calavera"> <atom:title type="text">Sites</atom:title> <accept>application/atom+xml;type=entry</accept> <categories xmlns:oos="http://11870.com/api/oos " href="http://localhost/api/v1/lists/calavera" oos:label="lists"/> <categories xmlns:oos=" http://11870.com/api/oos" href="http://localhost/api/v1/tags/calavera" oos:label="tags"/> <categories xmlns:oos=" http://11870.com/api/oos" href="http://localhost/api/v1/privacy" oos:label="privacy"/> </collection> <collection href="/api/v1/contacts/calavera"> <atom:title type="text">Contacts</atom:title> <accept>application/atom+xml;type=entry</accept> <categories xmlns:oos=" http://11870.com/api/oos" href="http://localhost/api/v1/trusted" oos:label="trusted"/> </collection> <collection href="/api/v1/users"> <atom:title type="text">Users</atom:title> <accept>image/*</accept> <accept>application/atom+xml;type=entry</accept> </collection> <collection href="/api/v1/search"> <atom:title type="text">Search</atom:title> </collection> </workspace></service>
más allá de atomPub
๏ sintaxis
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
<entry xmlns:app="http://www.w3.org/2007/app" xmlns:oos="http://11870.com/api/oos" xmlns:georss="http://www.georss.org/georss/10" xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> <id>http://11870.com/pro/23474/calavera</id> <title type="text">Apple Store Fifth Avenue</title> <oos:useraddress>767 5th Avenue</oos:useraddress> <oos:url>http://www.apple.com/retail/fifthavenue</oos:url> <oos:telephone>+1 212 3361440</oos:telephone> <oos:locality slug="/us/new-york">New York</oos:locality> <oos:country slug="/us">United States</oos:country>
más allá de atomPub
• sintaxis
๏ autenticación
T David Calavera Conferencia Rails 2007
más allá de atomPub
• sintaxis
๏ autenticación
T David Calavera Conferencia Rails 2007
➡ identificar aplicaciones
T David Calavera Conferencia Rails 2007
Net::HTTP.start( '11870.com' ) do |http| req = Net::HTTP::Get.new('/api/v1') req['appToken'] = 'el app token que 11870 te ha asignado' digest = Digest::MD5.hexdigest("#{req['appToken']}#{la clave secreta}") req['authSign'] = digest http.request reqend
más allá de atomPub
• sintaxis
๏ autenticación
T David Calavera Conferencia Rails 2007
➡ identificar aplicaciones
➡ autenticar usuarios
T David Calavera Conferencia Rails 2007
request['Authorization'] = 'WSSE profile="UsernameToken"'request['X-WSSE'] = wsse! def wsse!
nonce = Array.new(10){ rand(0x1000000) }.pack('I*') nonce_b64 = [nonce].pack("m").chomp now = Time.now.gmtime.strftime("%FT%TZ") digest = [Digest::SHA1.digest(nonce_b64 + now + @password)].pack("m").chomp
%Q<UsernameToken Username="#{@username}", PasswordDigest="#{digest}", Nonce="#{nonce_b64}", Created="#{now}">end
más allá de atomPub
• sintaxis
๏ autenticación
T David Calavera Conferencia Rails 2007
➡ identificar aplicaciones
➡ autenticar usuarios
➡ evolucionará a OAuth (http://oauth.net)
más allá de atomPub
• sintaxis
• autenticación
๏ múltiples representaciones
T David Calavera Conferencia Rails 2007
T David Calavera Conferencia Rails 2007
{ "id":"/api/v1/sites/calavera", "title":"Sites", "updated":"2007-09-28T07:53:46.000Z", "authors":[{ "name":"calavera" } ], "links":[{ "href":"http://11870.com/api/v1/sites/calavera", "rel":"self" },{ "href":"http://11870.com/api/v1/sites/calavera?page=2", "rel":"next" } ], "entries":[{ "lang":"es", "id":"http://11870.com/pro/23474/calavera", "title":"Apple Store Fifth Avenue", "summary":"en directo", "content":"estoy ahora mismo en esta...
más allá de atomPub
• sintaxis
• autenticación
• múltiples representaciones
๏ control de versiones
T David Calavera Conferencia Rails 2007
๏ ahora
T David Calavera Conferencia Rails 2007
Net::HTTP.start( '11870.com' ) do |http| http.request Net::HTTP::Get.new('/api/v1')end
• ahora
T David Calavera Conferencia Rails 2007
Net::HTTP.start( '11870.com' ) do |http| http.request Net::HTTP::Get.new('/api/v1')end
๏ en un futuro
Net::HTTP.start( '11870.com' ) do |http| http.request Net::HTTP::Get.new('/api/v1.5')end
más allá de atomPub
• sintaxis
• autenticación
• múltiples representaciones
• control de versiones
๏ soporte de librerías
T David Calavera Conferencia Rails 2007
http://code.google.com/p/api-11870/
T David Calavera Conferencia Rails 2007
más allá de atomPub
• sintaxis
• autenticación
• múltiples representaciones
• control de versiones
• soporte de librerías
๏ ¡documentación!T David Calavera Conferencia Rails 2007
http://groups.google.com/group/api-11870
T David Calavera Conferencia Rails 2007
la api de 11870.com oos4ruby
búsqueda
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_app 'appToken', 'secretKey'
oos.search q => 'apple store in new york'
oos.search bbox => ['SOUTH', 'WEST', 'NORTH', 'EAST']
oos.search lat => 'LATITUDE', lon => 'LONGITUDE', radius => '3000 METRES'
oos.search tags => ['restaurant', 'cheap', 'clean']
búsqueda
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_app 'appToken', 'secretKey'
oos.search q => 'apple store in new york'
oos.search bbox => ['SOUTH', 'WEST', 'NORTH', 'EAST']
oos.search lat => 'LATITUDE', lon => 'LONGITUDE', radius => '3000 METRES'
oos.search tags => ['restaurant', 'cheap', 'clean']
búsqueda
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_app 'appToken', 'secretKey'
oos.search q => 'apple store in new york'
oos.search bbox => ['SOUTH', 'WEST', 'NORTH', 'EAST']
oos.search lat => 'LATITUDE', lon => 'LONGITUDE', radius => '3000 METRES'
oos.search tags => ['restaurant', 'cheap', 'clean']
búsqueda
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_app 'appToken', 'secretKey'
oos.search q => 'apple store in new york'
oos.search bbox => ['SOUTH', 'WEST', 'NORTH', 'EAST']
oos.search lat => 'LATITUDE', lon => 'LONGITUDE', radius => '3000 METRES'
oos.search tags => ['restaurant', 'cheap', 'clean']
búsqueda
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_app 'appToken', 'secretKey'
oos.search q => 'apple store in new york'
oos.search bbox => ['SOUTH', 'WEST', 'NORTH', 'EAST']
oos.search lat => 'LATITUDE', lon => 'LONGITUDE', radius => '3000 METRES'
oos.search tags => ['restaurant', 'cheap', 'clean']
gestión
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_user 'user email', 'auth token'
user = oos.useruser.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end endend
user.contacts.create! :slug => 'calavera', :trusted => 'true'
user.update_avatar! '/Users/david/skull.png'
gestión
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_user 'user email', 'auth token'
user = oos.useruser.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end endend
user.contacts.create! :slug => 'calavera', :trusted => 'true'
user.update_avatar! '/Users/david/skull.png'
gestión
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_user 'user email', 'auth token'
user = oos.useruser.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end endend
user.contacts.create! :slug => 'calavera', :trusted => 'true'
user.update_avatar! '/Users/david/skull.png'
gestión
T David Calavera Conferencia Rails 2007
require 'oos4ruby'
oos = Oos.newoos.auth_user 'user email', 'auth token'
user = oos.useruser.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end endend
user.contacts.create! :slug => 'calavera', :trusted => 'true'
user.update_avatar! '/Users/david/skull.png'
¿...?