Slideshow transcript
Slide 1: Atom Publishing Protocol, ruby y la api de 11870.com David Calavera
Slide 2: antecedentes
Slide 3: 11870.com ๏ recuerda y comparte negocios ... David Calavera Conferencia Rails 2007
Slide 4: 11870.com • recuerda y comparte negocios ... ๏ no solo de comentarios vive el hombre David Calavera Conferencia Rails 2007
Slide 5: 11870.com • recuerda y comparte negocios ... • no solo de comentarios vive el hombre ๏ ¿por qué tengo que atarme a la web? David Calavera Conferencia Rails 2007
Slide 6: 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? David Calavera Conferencia Rails 2007
Slide 7: atomPub
Slide 8: “the atom publishing protocol is an application-level protocol for publishing and editing web resources” David Calavera Conferencia Rails 2007
Slide 9: ๏ ¿sabes qué es HTTP y como usarlo? David Calavera Conferencia Rails 2007
Slide 10: • ¿sabes qué es HTTP y como usarlo? ๏ ¿sabes qué es XML y como usarlo? David Calavera Conferencia Rails 2007
Slide 11: • ¿sabes qué es HTTP y como usarlo? • ¿sabes qué es XML y como usarlo? ๏ ¿sabes qué es un feed y como crearlo? David Calavera Conferencia Rails 2007
Slide 12: atomPub características
Slide 13: estándar http://ietfreport.isoc.org/idref/rfc5023 David Calavera Conferencia Rails 2007
Slide 14: basado en atom <?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> ... David Calavera Conferencia Rails 2007
Slide 15: arquitectura REST David Calavera Conferencia Rails 2007
Slide 16: arquitectura REST ๏ protocolo sin estado David Calavera Conferencia Rails 2007
Slide 17: arquitectura REST • protocolo sin estado ๏ operaciones bien definidas David Calavera Conferencia Rails 2007
Slide 18: arquitectura REST • protocolo sin estado • operaciones bien definidas ๏ sintaxis universal (IRI) David Calavera Conferencia Rails 2007
Slide 19: IRI www. .w3.mag.keio.ac.jp David Calavera Conferencia Rails 2007
Slide 20: URI 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 David Calavera Conferencia Rails 2007
Slide 21: introspectivo David Calavera Conferencia Rails 2007
Slide 22: introspectivo documento de servicio David Calavera Conferencia Rails 2007
Slide 23: introspectivo documento de servicio colección colección David Calavera Conferencia Rails 2007
Slide 24: introspectivo documento de servicio colección elementos colección elementos David Calavera Conferencia Rails 2007
Slide 25: fácilmente extensible <?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> ... David Calavera Conferencia Rails 2007
Slide 26: multimedia David Calavera Conferencia Rails 2007
Slide 27: más... ๏ paginación David Calavera Conferencia Rails 2007
Slide 28: <?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"/> ... David Calavera Conferencia Rails 2007
Slide 29: más... • paginación ๏ caché David Calavera Conferencia Rails 2007
Slide 30: POST /wp-app.php/posts HTTP/1.1 201 Created Content-Type: application/atom+xml;type=entry;charset="utf-8" ETag: "c180de84f991g8" David Calavera Conferencia Rails 2007
Slide 31: POST /wp-app.php/posts HTTP/1.1 201 Created Content-Type: application/atom+xml;type=entry;charset="utf-8" ETag: "c180de84f991g8" GET /wp-app.php/post/3 HTTP/1.1 304 Not Modified If-None-Match: "c180de84f991g8" David Calavera Conferencia Rails 2007
Slide 32: POST /wp-app.php/posts HTTP/1.1 201 Created Content-Type: application/atom+xml;type=entry;charset="utf-8" ETag: "c180de84f991g8" GET /wp-app.php/post/3 HTTP/1.1 304 Not Modified If-None-Match: "c180de84f991g8" PUT /wp-app.php/post/3 HTTP/1.1 412 Precondition Failed If-Match: "c180de84f991g8" David Calavera Conferencia Rails 2007
Slide 33: más... • paginación • caché ๏ control de estado David Calavera Conferencia Rails 2007
Slide 34: <?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> ... David Calavera Conferencia Rails 2007
Slide 35: más... • paginación • caché • control de estado ๏ seguridad David Calavera Conferencia Rails 2007
Slide 36: atomPub estructura
Slide 37: atomPub:service GET 'http://www.verbosemode.com/wp-app.php/service' HTTP/1.1 200 OK David Calavera Conferencia Rails 2007
Slide 38: atomPub:service <?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> David Calavera Conferencia Rails 2007
Slide 39: atomPub:service <?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> David Calavera Conferencia Rails 2007
Slide 40: atomPub:service <?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> David Calavera Conferencia Rails 2007
Slide 41: atomPub:service <?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> David Calavera Conferencia Rails 2007
Slide 42: atomPub:service <?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> David Calavera Conferencia Rails 2007
Slide 43: atomPub:categories GET 'http://www.verbosemode.com/wp-app.php/categories' HTTP/1.1 200 OK David Calavera Conferencia Rails 2007
Slide 44: atomPub:categories <?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> David Calavera Conferencia Rails 2007
Slide 45: atomPub:collection POST 'http://www.verbosemode.com/wp-app.php/posts' HTTP/1.1 201 Created Content-Type: */* Location: 'http://www.verbosemode.com/wp-app.php/post/3' Content-Location: 'http://www.verbosemode.com/wp-app.php/post/3' GET 'http://www.verbosemode.com/wp-app.php/posts' HTTP/1.1 200 OK David Calavera Conferencia Rails 2007
Slide 46: atomPub:collection <?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> ... David Calavera Conferencia Rails 2007
Slide 47: atomPub:collection <?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> ... David Calavera Conferencia Rails 2007
Slide 48: atomPub:collection <?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> ... David Calavera Conferencia Rails 2007
Slide 49: atomPub:entry PUT 'http://www.verbosemode.com/wp-app.php/post/3' HTTP/1.1 204 No Content Content-Type: application/atom+xml;type=entry DELETE 'http://www.verbosemode.com/wp-app.php/post/3' HTTP/1.1 200 OK GET 'http://www.verbosemode.com/wp-app.php/post/3' HTTP/1.1 200 OK David Calavera Conferencia Rails 2007
Slide 50: atomPub:entry <?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> David Calavera Conferencia Rails 2007
Slide 51: atomPub:entry ¿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> David Calavera Conferencia Rails 2007
Slide 52: atomPub:entry ¿y... qué pasa con los otros tipos de recursos? PUT 'http://www.verbosemode.com/wp-app.php/attachment/file/4' HTTP/1.1 204 No Content Content-Type: */* DELETE 'http://www.verbosemode.com/wp-app.php/attachment/file/4' HTTP/1.1 200 OK GET 'http://www.verbosemode.com/wp-app.php/attachment/file/4' HTTP/1.1 200 OK David Calavera Conferencia Rails 2007
Slide 54: atomPub ¿pero... hay gente que usa esto?
Slide 55: ๏ google: gdata, youtube, openSocial David Calavera Conferencia Rails 2007
Slide 56: • google: gdata, youtube, openSocial ๏ microsoft: windows live writer David Calavera Conferencia Rails 2007
Slide 57: • google: gdata, youtube, openSocial • microsoft: windows live writer ๏ ibm: lotus connections David Calavera Conferencia Rails 2007
Slide 58: • google: gdata, youtube, openSocial • microsoft: windows live writer • ibm: lotus connections ๏ wordpress David Calavera Conferencia Rails 2007
Slide 59: • google: gdata, youtube, openSocial • microsoft: windows live writer • ibm: lotus connections • wordpress ๏ nokia: liveblog David Calavera Conferencia Rails 2007
Slide 60: • google: gdata, youtube, openSocial • microsoft: windows live writer • ibm: lotus connections • wordpress • nokia: liveblog ๏ six apart: typepad, movable type David Calavera Conferencia Rails 2007
Slide 61: • google: gdata, youtube, openSocial • microsoft: windows live writer • ibm: lotus connections • wordpress • nokia: liveblog • six apart: typepad, movable type ๏ 11870.com
Slide 62: ruby sin más
Slide 63: Net::HTTP David Calavera Conferencia Rails 2007
Slide 64: Net::HTTP ๏ fácil de mantener David Calavera Conferencia Rails 2007
Slide 65: Net::HTTP • fácil de mantener ๏ respuesta condicionada al estado David Calavera Conferencia Rails 2007
Slide 66: 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 David Calavera Conferencia Rails 2007
Slide 67: Net:HTTP • fácil de mantener • respuesta condicionada al estado ๏ no sabe si estoy en una capa segura David Calavera Conferencia Rails 2007
Slide 68: require 'net/http' require 'net/https' @uri = 'https://registro.conferenciarails.org' http = Net::HTTP.new @uri http.use_ssl = true if @uri =~ /^https/ David Calavera Conferencia Rails 2007
Slide 69: los cuatro verbos http Net::HTTP.start(@uri.host, @uri.port) do |http| end David Calavera Conferencia Rails 2007
Slide 70: los cuatro verbos http Net::HTTP.start(@uri.host, @uri.port) do |http| #POST http.request Net::HTTP::Post.new(@uri.path), data end David Calavera Conferencia Rails 2007
Slide 71: 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 David Calavera Conferencia Rails 2007
Slide 72: 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 end David Calavera Conferencia Rails 2007
Slide 73: 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 David Calavera Conferencia Rails 2007
Slide 74: REXML ๏ parser completo David Calavera Conferencia Rails 2007
Slide 75: REXML • parser completo ๏ escrito completamente en ruby David Calavera Conferencia Rails 2007
Slide 76: REXML • parser completo • escrito completamente en ruby ๏ pasa los test de aceptación de Oasis David Calavera Conferencia Rails 2007
Slide 77: REXML • parser completo • escrito completamente en ruby • pasa los test de aceptación de Oasis ๏ soporta XPath David Calavera Conferencia Rails 2007
Slide 78: REXML y xpath 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 David Calavera Conferencia Rails 2007
Slide 79: REXML y xpath 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 David Calavera Conferencia Rails 2007
Slide 80: REXML y xpath 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 David Calavera Conferencia Rails 2007
Slide 81: REXML y xpath 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 David Calavera Conferencia Rails 2007
Slide 82: REXML y xpath 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 David Calavera Conferencia Rails 2007
Slide 83: Builder ๏ crea xml fácilmente David Calavera Conferencia Rails 2007
Slide 84: 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' end end David Calavera Conferencia Rails 2007
Slide 85: Builder • crea xml fácilmente ๏ no solo se usa con rails David Calavera Conferencia Rails 2007
Slide 86: ๏ in the beginning... was the command line builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2) David Calavera Conferencia Rails 2007
Slide 87: • in the beginning... was the command line builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2) ๏ vamos de camping Camping.goes :Atom module Atom::Views def index html do head do title 'Atom Publishing Protocol @ conferecia rails' end body do ... end end end David Calavera Conferencia Rails 2007
Slide 88: ruby extras
Slide 89: atom-tools http://code.necronomicorp.com/atom-tools ๏ parsea y manipula feeds David Calavera Conferencia Rails 2007
Slide 90: atom-tools http://code.necronomicorp.com/atom-tools • parsea y manipula feeds ๏ adaptado al rfc 5023 David Calavera Conferencia Rails 2007
Slide 91: atom-tools http://code.necronomicorp.com/atom-tools • parsea y manipula feeds • adaptado al rfc 5023 ๏ abstracción de http y xml David Calavera Conferencia Rails 2007
Slide 92: require 'atom-tools' http = Atom::HTTP.new http.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.accepts end David Calavera Conferencia Rails 2007
Slide 93: require 'atom-tools' http = Atom::HTTP.new http.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.accepts end David Calavera Conferencia Rails 2007
Slide 94: require 'atom-tools' http = Atom::HTTP.new http.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.accepts end David Calavera Conferencia Rails 2007
Slide 95: atom_pub_server http://svn.thinkincode.net/rails/plugins/atom_pub_server ๏ rails es REST David Calavera Conferencia Rails 2007
Slide 96: atom_pub_server http://svn.thinkincode.net/rails/plugins/atom_pub_server • rails es REST ๏ mejor soporte para atom y atomPub David Calavera Conferencia Rails 2007
Slide 97: 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 David Calavera Conferencia Rails 2007
Slide 98: 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 David Calavera Conferencia Rails 2007
Slide 99: atom_pub_server http://svn.thinkincode.net/rails/plugins/atom_pub_server • rails es REST • mejor soporte para atom y atomPub ๏ acts_as_collection David Calavera Conferencia Rails 2007
Slide 100: 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 David Calavera Conferencia Rails 2007
Slide 101: atom_pub_server http://svn.thinkincode.net/rails/plugins/atom_pub_server • rails es REST • mejor soporte para atom y atomPub • acts_as_collection ๏ acts_as_service_document David Calavera Conferencia Rails 2007
Slide 102: class ServicesController < ApplicationController acts_as_service_document def index render :xml => service_document end end David Calavera Conferencia Rails 2007
Slide 103: the ape http://www.tbray.org/ape ๏ the atom publishing exerciser
Slide 104: the ape http://www.tbray.org/ape • the atom publishing exerciser ๏ introspección!!! David Calavera Conferencia Rails 2007
Slide 105: David Calavera Conferencia Rails 2007
Slide 106: the ape http://www.tbray.org/ape • the atom publishing exerciser • introspección!!! ๏ varios sistemas de autenticación David Calavera Conferencia Rails 2007
Slide 107: David Calavera Conferencia Rails 2007
Slide 108: the ape http://www.tbray.org/ape • the atom publishing exerciser • introspección!!! • varios sistemas de autenticación ๏ no es muy fácil de instalar (de momento) David Calavera Conferencia Rails 2007
Slide 109: the ape http://www.tbray.org/ape • the atom publishing exerciser • introspección!!! • varios sistemas de autenticación • no es muy fácil de instalar (de momento) ๏ no es muy fácil de configurar (de momento) David Calavera Conferencia Rails 2007
Slide 110: la api de 11870.com http://11870.com/api
Slide 111: por partes ๏ api de búsqueda ➡ formato openSearch (http://opensearch.org) David Calavera Conferencia Rails 2007
Slide 112: <?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> David Calavera Conferencia Rails 2007
Slide 113: por partes • api de búsqueda ๏ api de gestión de contenidos David Calavera Conferencia Rails 2007
Slide 114: <?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> David Calavera Conferencia Rails 2007
Slide 115: más allá de atomPub ๏ sintaxis David Calavera Conferencia Rails 2007
Slide 116: <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> David Calavera Conferencia Rails 2007
Slide 117: más allá de atomPub • sintaxis ๏ autenticación David Calavera Conferencia Rails 2007
Slide 118: más allá de atomPub • sintaxis ๏ autenticación ➡ identificar aplicaciones David Calavera Conferencia Rails 2007
Slide 119: 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 req end David Calavera Conferencia Rails 2007
Slide 120: más allá de atomPub • sintaxis ๏ autenticación ➡ identificar aplicaciones ➡ autenticar usuarios David Calavera Conferencia Rails 2007
Slide 121: 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 David Calavera Conferencia Rails 2007
Slide 122: más allá de atomPub • sintaxis ๏ autenticación ➡ identificar aplicaciones ➡ autenticar usuarios ➡ evolucionará a OAuth (http://oauth.net) David Calavera Conferencia Rails 2007
Slide 123: más allá de atomPub • sintaxis • autenticación ๏ múltiples representaciones David Calavera Conferencia Rails 2007
Slide 124: { "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... David Calavera Conferencia Rails 2007
Slide 125: más allá de atomPub • sintaxis • autenticación • múltiples representaciones ๏ control de versiones David Calavera Conferencia Rails 2007
Slide 126: ๏ ahora Net::HTTP.start( '11870.com' ) do |http| http.request Net::HTTP::Get.new('/api/v1') end David Calavera Conferencia Rails 2007
Slide 127: • ahora 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 David Calavera Conferencia Rails 2007
Slide 128: más allá de atomPub • sintaxis • autenticación • múltiples representaciones • control de versiones ๏ soporte de librerías David Calavera Conferencia Rails 2007
Slide 129: http://code.google.com/p/api-11870/ David Calavera Conferencia Rails 2007
Slide 130: más allá de atomPub • sintaxis • autenticación • múltiples representaciones • control de versiones • soporte de librerías ๏ ¡documentación! David Calavera Conferencia Rails 2007
Slide 131: http://groups.google.com/group/api-11870 David Calavera Conferencia Rails 2007
Slide 132: la api de 11870.com oos4ruby
Slide 133: búsqueda require 'oos4ruby' oos = Oos.new oos.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'] David Calavera Conferencia Rails 2007
Slide 134: búsqueda require 'oos4ruby' oos = Oos.new oos.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'] David Calavera Conferencia Rails 2007
Slide 135: búsqueda require 'oos4ruby' oos = Oos.new oos.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'] David Calavera Conferencia Rails 2007
Slide 136: búsqueda require 'oos4ruby' oos = Oos.new oos.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'] David Calavera Conferencia Rails 2007
Slide 137: búsqueda require 'oos4ruby' oos = Oos.new oos.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'] David Calavera Conferencia Rails 2007
Slide 138: gestión require 'oos4ruby' oos = Oos.new oos.auth_user 'user email', 'auth token' user = oos.user user.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end end end user.contacts.create! :slug => 'calavera', :trusted => 'true' user.update_avatar! '/Users/david/skull.png' David Calavera Conferencia Rails 2007
Slide 139: gestión require 'oos4ruby' oos = Oos.new oos.auth_user 'user email', 'auth token' user = oos.user user.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end end end user.contacts.create! :slug => 'calavera', :trusted => 'true' user.update_avatar! '/Users/david/skull.png' David Calavera Conferencia Rails 2007
Slide 140: gestión require 'oos4ruby' oos = Oos.new oos.auth_user 'user email', 'auth token' user = oos.user user.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end end end user.contacts.create! :slug => 'calavera', :trusted => 'true' user.update_avatar! '/Users/david/skull.png' David Calavera Conferencia Rails 2007
Slide 141: gestión require 'oos4ruby' oos = Oos.new oos.auth_user 'user email', 'auth token' user = oos.user user.sites.each do |pro| unless pro.multimedia.empty? pro.multimedia.each do |media| puts media.type puts media.src end end end user.contacts.create! :slug => 'calavera', :trusted => 'true' user.update_avatar! '/Users/david/skull.png' David Calavera Conferencia Rails 2007
Slide 142: ¿...?
Slide 143: muchas gracias http://thinkincode.net




Add a comment on Slide 1
If you have a SlideShare account, login to comment; else you can comment as a guest- Favorites & Groups
Showing 1-50 of 1 (more)