atompub, ruby y la api de 11870

143
Atom Publishing Protocol, ruby y la api de 11870.com David Calavera

Upload: david-calavera

Post on 13-Jan-2015

2.808 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: atomPub, ruby y la api de 11870

Atom Publishing Protocol, ruby y la api de 11870.com

David Calavera

Page 2: atomPub, ruby y la api de 11870

antecedentes

Page 3: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

11870.com

๏ recuerda y comparte negocios ...

Page 4: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

11870.com

• recuerda y comparte negocios ...

๏ no solo de comentarios vive el hombre

Page 5: atomPub, ruby y la api de 11870

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?

Page 6: atomPub, ruby y la api de 11870

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?

Page 7: atomPub, ruby y la api de 11870

atomPub

Page 8: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

“the atom publishing protocol is an application-level protocol for publishing and editing web resources”

Page 9: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

๏ ¿sabes qué es HTTP y como usarlo?

Page 10: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

• ¿sabes qué es HTTP y como usarlo?

๏ ¿sabes qué es XML y como usarlo?

Page 11: atomPub, ruby y la api de 11870

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?

Page 12: atomPub, ruby y la api de 11870

atomPub características

Page 13: atomPub, ruby y la api de 11870

estándar

http://ietfreport.isoc.org/idref/rfc5023

T David Calavera Conferencia Rails 2007

Page 14: atomPub, ruby y la api de 11870

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> ...

Page 15: atomPub, ruby y la api de 11870

arquitectura REST

T David Calavera Conferencia Rails 2007

Page 16: atomPub, ruby y la api de 11870

arquitectura REST

๏ protocolo sin estado

T David Calavera Conferencia Rails 2007

Page 17: atomPub, ruby y la api de 11870

arquitectura REST

• protocolo sin estado

๏ operaciones bien definidas

T David Calavera Conferencia Rails 2007

Page 18: atomPub, ruby y la api de 11870

arquitectura REST

• protocolo sin estado

• operaciones bien definidas

๏ sintaxis universal (IRI)

T David Calavera Conferencia Rails 2007

Page 19: atomPub, ruby y la api de 11870

IRI

T David Calavera Conferencia Rails 2007

www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp

Page 20: atomPub, ruby y la api de 11870

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

Page 21: atomPub, ruby y la api de 11870

introspectivo

T David Calavera Conferencia Rails 2007

Page 22: atomPub, ruby y la api de 11870

introspectivo

documento de servicio

T David Calavera Conferencia Rails 2007

Page 23: atomPub, ruby y la api de 11870

introspectivo

documento de servicio

colección

colección

T David Calavera Conferencia Rails 2007

Page 24: atomPub, ruby y la api de 11870

introspectivo

documento de servicio

colección

elementos

colección

elementos

T David Calavera Conferencia Rails 2007

Page 25: atomPub, ruby y la api de 11870

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> ...

Page 26: atomPub, ruby y la api de 11870

multimedia

T David Calavera Conferencia Rails 2007

Page 27: atomPub, ruby y la api de 11870

más...

๏ paginación

T David Calavera Conferencia Rails 2007

Page 28: atomPub, ruby y la api de 11870

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"/> ...

Page 29: atomPub, ruby y la api de 11870

más...

• paginación

๏ caché

T David Calavera Conferencia Rails 2007

Page 30: atomPub, ruby y la api de 11870

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"

Page 31: atomPub, ruby y la api de 11870

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"

Page 32: atomPub, ruby y la api de 11870

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"

Page 33: atomPub, ruby y la api de 11870

más...

• paginación

• caché

๏ control de estado

T David Calavera Conferencia Rails 2007

Page 34: atomPub, ruby y la api de 11870

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>...

Page 35: atomPub, ruby y la api de 11870

más...

• paginación

• caché

• control de estado

T David Calavera Conferencia Rails 2007

๏ seguridad

Page 36: atomPub, ruby y la api de 11870

atomPub estructura

Page 37: atomPub, ruby y la api de 11870

atomPub:service

T David Calavera Conferencia Rails 2007

GET 'http://www.verbosemode.com/wp-app.php/service'HTTP/1.1 200 OK

Page 38: atomPub, ruby y la api de 11870

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>

Page 39: atomPub, ruby y la api de 11870

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>

Page 40: atomPub, ruby y la api de 11870

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>

Page 41: atomPub, ruby y la api de 11870

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>

Page 42: atomPub, ruby y la api de 11870

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>

Page 43: atomPub, ruby y la api de 11870

atomPub:categories

T David Calavera Conferencia Rails 2007

GET 'http://www.verbosemode.com/wp-app.php/categories'HTTP/1.1 200 OK

Page 44: atomPub, ruby y la api de 11870

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>

Page 45: atomPub, ruby y la api de 11870

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'

Page 46: atomPub, ruby y la api de 11870

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> ...

Page 47: atomPub, ruby y la api de 11870

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> ...

Page 48: atomPub, ruby y la api de 11870

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> ...

Page 49: atomPub, ruby y la api de 11870

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

Page 50: atomPub, ruby y la api de 11870

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&#8217;m ...</summary></entry>

Page 51: atomPub, ruby y la api de 11870

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>

Page 52: atomPub, ruby y la api de 11870

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

Page 53: atomPub, ruby y la api de 11870
Page 54: atomPub, ruby y la api de 11870

atomPub ¿pero... hay gente que usa esto?

Page 55: atomPub, ruby y la api de 11870

๏ google: gdata, youtube, openSocial

T David Calavera Conferencia Rails 2007

Page 56: atomPub, ruby y la api de 11870

๏ microsoft: windows live writer

• google: gdata, youtube, openSocial

T David Calavera Conferencia Rails 2007

Page 57: atomPub, ruby y la api de 11870

๏ ibm: lotus connections

• microsoft: windows live writer

• google: gdata, youtube, openSocial

T David Calavera Conferencia Rails 2007

Page 58: atomPub, ruby y la api de 11870

• ibm: lotus connections

๏ wordpress

• microsoft: windows live writer

• google: gdata, youtube, openSocial

T David Calavera Conferencia Rails 2007

Page 59: atomPub, ruby y la api de 11870

• ibm: lotus connections

• wordpress

๏ nokia: liveblog

• microsoft: windows live writer

• google: gdata, youtube, openSocial

T David Calavera Conferencia Rails 2007

Page 60: atomPub, ruby y la api de 11870

• 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

Page 61: atomPub, ruby y la api de 11870

• ibm: lotus connections

• wordpress

• nokia: liveblog

• microsoft: windows live writer

• google: gdata, youtube, openSocial

• six apart: typepad, movable type

๏ 11870.com

Page 62: atomPub, ruby y la api de 11870

ruby sin más

Page 63: atomPub, ruby y la api de 11870

Net::HTTP

T David Calavera Conferencia Rails 2007

Page 64: atomPub, ruby y la api de 11870

Net::HTTP

๏ fácil de mantener

T David Calavera Conferencia Rails 2007

Page 65: atomPub, ruby y la api de 11870

Net::HTTP

• fácil de mantener

๏ respuesta condicionada al estado

T David Calavera Conferencia Rails 2007

Page 66: atomPub, ruby y la api de 11870

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

Page 67: atomPub, ruby y la api de 11870

Net:HTTP

• fácil de mantener

• respuesta condicionada al estado

T David Calavera Conferencia Rails 2007

๏ no sabe si estoy en una capa segura

Page 68: atomPub, ruby y la api de 11870

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/

Page 69: atomPub, ruby y la api de 11870

los cuatro verbos http

Net::HTTP.start(@uri.host, @uri.port) do |http|end

T David Calavera Conferencia Rails 2007

Page 70: atomPub, ruby y la api de 11870

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

Page 71: atomPub, ruby y la api de 11870

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

Page 72: atomPub, ruby y la api de 11870

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

Page 73: atomPub, ruby y la api de 11870

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

Page 74: atomPub, ruby y la api de 11870

REXML

๏ parser completo

T David Calavera Conferencia Rails 2007

Page 75: atomPub, ruby y la api de 11870

REXML

• parser completo

๏ escrito completamente en ruby

T David Calavera Conferencia Rails 2007

Page 76: atomPub, ruby y la api de 11870

REXML

• parser completo

• escrito completamente en ruby

T David Calavera Conferencia Rails 2007

๏ pasa los test de aceptación de Oasis

Page 77: atomPub, ruby y la api de 11870

REXML

• parser completo

• escrito completamente en ruby

T David Calavera Conferencia Rails 2007

• pasa los test de aceptación de Oasis

๏ soporta XPath

Page 78: atomPub, ruby y la api de 11870

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

Page 79: atomPub, ruby y la api de 11870

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

Page 80: atomPub, ruby y la api de 11870

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

Page 81: atomPub, ruby y la api de 11870

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

Page 82: atomPub, ruby y la api de 11870

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

Page 83: atomPub, ruby y la api de 11870

Builder

๏ crea xml fácilmente

T David Calavera Conferencia Rails 2007

Page 84: atomPub, ruby y la api de 11870

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

Page 85: atomPub, ruby y la api de 11870

Builder

• crea xml fácilmente

๏ no solo se usa con rails

T David Calavera Conferencia Rails 2007

Page 86: atomPub, ruby y la api de 11870

๏ in the beginning... was the command line

T David Calavera Conferencia Rails 2007

builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)

Page 87: atomPub, ruby y la api de 11870

• 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

Page 88: atomPub, ruby y la api de 11870

ruby extras

Page 89: atomPub, ruby y la api de 11870

atom-tools

๏ parsea y manipula feeds

T David Calavera Conferencia Rails 2007

http://code.necronomicorp.com/atom-tools

Page 90: atomPub, ruby y la api de 11870

atom-tools

• parsea y manipula feeds

T David Calavera Conferencia Rails 2007

๏ adaptado al rfc 5023

http://code.necronomicorp.com/atom-tools

Page 91: atomPub, ruby y la api de 11870

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

Page 92: atomPub, ruby y la api de 11870

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

Page 93: atomPub, ruby y la api de 11870

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

Page 94: atomPub, ruby y la api de 11870

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

Page 95: atomPub, ruby y la api de 11870

atom_pub_server

๏ rails es REST

T David Calavera Conferencia Rails 2007

http://svn.thinkincode.net/rails/plugins/atom_pub_server

Page 96: atomPub, ruby y la api de 11870

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

Page 97: atomPub, ruby y la api de 11870

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

Page 98: atomPub, ruby y la api de 11870

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

Page 99: atomPub, ruby y la api de 11870

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

Page 100: atomPub, ruby y la api de 11870

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

Page 101: atomPub, ruby y la api de 11870

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

Page 102: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

class ServicesController < ApplicationController acts_as_service_document def index render :xml => service_document endend

Page 103: atomPub, ruby y la api de 11870

the ape

๏ the atom publishing exerciser

http://www.tbray.org/ape

Page 104: atomPub, ruby y la api de 11870

the ape

• the atom publishing exerciser

๏ introspección!!!

T David Calavera Conferencia Rails 2007

http://www.tbray.org/ape

Page 105: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

Page 106: atomPub, ruby y la api de 11870

the ape

• the atom publishing exerciser

• introspección!!!

๏ varios sistemas de autenticación

T David Calavera Conferencia Rails 2007

http://www.tbray.org/ape

Page 107: atomPub, ruby y la api de 11870

T David Calavera Conferencia Rails 2007

Page 108: atomPub, ruby y la api de 11870

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

Page 109: atomPub, ruby y la api de 11870

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

Page 110: atomPub, ruby y la api de 11870

la api de 11870.com http://11870.com/api

Page 111: atomPub, ruby y la api de 11870

por partes

๏ api de búsqueda

T David Calavera Conferencia Rails 2007

➡ formato openSearch (http://opensearch.org)

Page 112: atomPub, ruby y la api de 11870

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>

Page 113: atomPub, ruby y la api de 11870

por partes

• api de búsqueda

๏ api de gestión de contenidos

T David Calavera Conferencia Rails 2007

Page 114: atomPub, ruby y la api de 11870

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>

Page 115: atomPub, ruby y la api de 11870

más allá de atomPub

๏ sintaxis

T David Calavera Conferencia Rails 2007

Page 116: atomPub, ruby y la api de 11870

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>

Page 117: atomPub, ruby y la api de 11870

más allá de atomPub

• sintaxis

๏ autenticación

T David Calavera Conferencia Rails 2007

Page 118: atomPub, ruby y la api de 11870

más allá de atomPub

• sintaxis

๏ autenticación

T David Calavera Conferencia Rails 2007

➡ identificar aplicaciones

Page 119: atomPub, ruby y la api de 11870

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

Page 120: atomPub, ruby y la api de 11870

más allá de atomPub

• sintaxis

๏ autenticación

T David Calavera Conferencia Rails 2007

➡ identificar aplicaciones

➡ autenticar usuarios

Page 121: atomPub, ruby y la api de 11870

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

Page 122: atomPub, ruby y la api de 11870

más allá de atomPub

• sintaxis

๏ autenticación

T David Calavera Conferencia Rails 2007

➡ identificar aplicaciones

➡ autenticar usuarios

➡ evolucionará a OAuth (http://oauth.net)

Page 123: atomPub, ruby y la api de 11870

más allá de atomPub

• sintaxis

• autenticación

๏ múltiples representaciones

T David Calavera Conferencia Rails 2007

Page 124: atomPub, ruby y la api de 11870

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...

Page 125: atomPub, ruby y la api de 11870

más allá de atomPub

• sintaxis

• autenticación

• múltiples representaciones

๏ control de versiones

T David Calavera Conferencia Rails 2007

Page 126: atomPub, ruby y la api de 11870

๏ ahora

T David Calavera Conferencia Rails 2007

Net::HTTP.start( '11870.com' ) do |http| http.request Net::HTTP::Get.new('/api/v1')end

Page 127: atomPub, ruby y la api de 11870

• 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

Page 128: atomPub, ruby y la api de 11870

más allá de atomPub

• sintaxis

• autenticación

• múltiples representaciones

• control de versiones

๏ soporte de librerías

T David Calavera Conferencia Rails 2007

Page 129: atomPub, ruby y la api de 11870

http://code.google.com/p/api-11870/

T David Calavera Conferencia Rails 2007

Page 130: atomPub, ruby y la api de 11870

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

Page 131: atomPub, ruby y la api de 11870

http://groups.google.com/group/api-11870

T David Calavera Conferencia Rails 2007

Page 132: atomPub, ruby y la api de 11870

la api de 11870.com oos4ruby

Page 133: atomPub, ruby y la api de 11870

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

Page 134: atomPub, ruby y la api de 11870

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

Page 135: atomPub, ruby y la api de 11870

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

Page 136: atomPub, ruby y la api de 11870

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

Page 137: atomPub, ruby y la api de 11870

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

Page 138: atomPub, ruby y la api de 11870

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'

Page 139: atomPub, ruby y la api de 11870

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'

Page 140: atomPub, ruby y la api de 11870

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'

Page 141: atomPub, ruby y la api de 11870

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'

Page 142: atomPub, ruby y la api de 11870

¿...?

Page 143: atomPub, ruby y la api de 11870

muchas gracias http://thinkincode.net