SlideShare uma empresa Scribd logo
1 de 54
Baixar para ler offline
APIs REST Usables

Javier Ramírez

@supercoco9
@aspgems
APIs REST
                                           usableS*
                                                      edición codemotion.es

{"links":[
 {"rel":"author", "uri":"http://javier-ramirez.com"},
 {"rel":"work", "uri":"http://aspgems.com"},
 {"rel":"twittEr", "uri":"http//twitter.com/supercoco9"}
 {"rel":"api-usable", "uri":"https//invoicefu.com"}
]}
*ningún gatico (ni ningún friki ansioso) ha sido dañado para hacer esta presentación
1996
1995
1996
1994
2001
La usabilidad Web es un
  enfoque para construir
sitios web faciles de usar
            '
para un usuario final, sin
 que se requiera ninguna
   formacion especializada
          '
Learnability
EfficIeNcy
MemorabiliTy
Errors
SatisfActiOn
API “REST”
Hecha con RAILS
  en lo que se
 TARDA EN decir
  constantinopla
separation of concerns
modelo de
                         recursos
                 Autenticación y
                      (NO) Estado
                        formatos
Estados y gestión     versionado
de errores               múltiples
analítica          consumidores
monetización          paginación
Documentación       Escalabilidad
first class api?           cuotas
                       metadatos
… y uSaBiLidAd             cachés
BASIC ACCESS AUTHENTICATION
 authenticate_or_request_with_http_basic do |login, password|
   User.find_by_login_and_password login, password
 end
User and password must be passed every time




TOKEN
Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
User.find_by_login_and_api_key( params[:login], params[:api_key] )
Client can send it as a parameter or as a header




OAUTH
Depends on third party libraries
Requires initial registration of client and more integration
SUCCESS consistently




       fail consistently
huddle
 twitter                                     200 OK
 200       OK     Success!                   201 Created
 304       Not Modified                      202 Accepted
 400       Bad Request                       400 Bad Request
 401       Unauthorized                      401
 403       Forbidden                         Unauthorized
 404       Not Found                         403 Forbidden
 406       Not Acceptable                    404 Not Found
 420       Enhance Your Calm                 410 Gone
                                 invoicefu
 500       Internal Server
                                 200 OK     Success!
 Error
                                 201 Created
 502       Bad Gateway
                                 304 Not Modified
 503       Service Unavailable
                                 401 Unauthorized
                                 404 Not Found
Useful Status                    422 Unprocessable Entity
429 Too many requests            406 Not Acceptable
204 No Content                   500 Internal Server Error
Accept: application/vnd.aspgems.invoicefu.v1.xml

   THE
 ACCEPT
 HEADER


HTTP/REST Standard        Not everyone          Less obvious
Unambiguous               supports headers      Harder to use
Resources !=              or custom types.      Non standard content-
Representations           Generic content       types
Version as you need it    types are             Skips HTTP server logs
                          preferred
REST explicado por un señor
que tan listo no será cuando
        no usa gafas
client-server,stateless,layered,cacheable
Resources
    Resource Identifiers
    Resource metadata
Uniform interface
    operations
    Representations
    Representation metadata
HATEOAS
Optionally: code on demand       señor sin gafas
INTERFAZ UNIFORME


 get, HEAD, TRACE,
      OPTIONS
post, put*, delete*,
      PATCH*
*fallbacks para clientes viejos o
incompletos
here
   be
dragons
restfest 2011
expose ONLY
      WHAT IS
Strictly necessary
resources are not models
Aggregation/
 composition




               Multiple
           representations
Hypermedia

APIs descubribles
Recursos asociados
Siguientes pasos
Paginación
https://invoicefu.com?
     format=xml
curl -X POST "https://invoicefu.com/api/session?
format=xml&login=hello@invoicefu.com&password=YAY

  <?xml version="1.0" encoding="UTF-8"?>
  <user>
   <id>3</id>
   <name>javier ramir</name>
   <email>javier@formatinternet.com</email>
   <locale>es</locale>
   <twitter-nickname>supercoco9</twitter-nickname>
   <facebook-uid nil="true"></facebook-uid>
   <facebook-nickname nil="true"></facebook-nickname>
   <api-key>c23e830d9b092a3a801d7f49b46</api-key>
   <links>
       <link>
      <rel>clients</rel>
      <uri>https://invoicefu.com/api/accounts/3-javier-ramirez/clients</uri>
      <methods>GET,POST</methods>
    </link>
    <link>
      <rel>new_client</rel>
      <uri>https://invoicefu.com/api/accounts/3-javier-ramirez/clients/new</uri>
      <methods>GET</methods>
    </link>
Rob Eisenberg
<productions>
 <links>
  <link rel="self" href="..." />
  <link rel="next" href="..." />
 </links>
 <production>
  <name>RavenDB</name>
  <author>Oren Eini</author>
  <links>
    <link rel="self" href="..." />
    <link rel="rels/episodes" href="..." />
  </links>
 </production>
 <production>
  <name>Art of Speaking</name>
  <author>Scott Hanselman</author>
  <links>
    <link rel="self" href="..." />
    <link rel="rels/episodes" href="..." />
  </links>
 </production>
 <!--other productions elided-->
</productions>
Mike Kelly
{
 "_links": {
   "self": { "href": "..." }
 },
 "title": "Real World ASP.NET MVC3",
 "description": "In this advanced, somewhat-opinionated...",
 "permitted": true,
 "_embedded": {
   "episodes": [{
     "_links": {
       "self": { "href": "..." },
       "media": [{
         "type": "video/webm; codecs='vp8.0, vorbis'",
         "href": "..."
       },{
         "type": "video/ogg; codecs='theora, vorbis'",
         "href": "..."
       }]
     },
     "title": "Foundations",
     "description": "In this episode we talk about what it is we're doing: building our
startup and getting ourselves off the ground. We take..",
     "released": 1306972800
   }
DARREL MILLER
{
    "_links" : {
    "self" : { "href" : "/user/95/allproductions" },
    },
    "name" : "Joe",
    "_embedded" : {
        "urn:tekpub:production" : [
        { "_links": {
                  "self": { "href": "/production/22" },
               },
           "allowed" : "true",
           "title" : "Rails runs rings round ReST resource representations"
        },
        { "_links": {
                  "self": { "href": "/production/74" },
               },
           "allowed" : "false",
           "title" : "Surfing the waves beats surfing an API"
        }
      ]
    }
}
ACTS AS API :Filtros
URI templates
http://example.com/~{username}/
http://example.com/dictionary/{term:1}/{term}
http://example.com/search{?q,lang}
> curl "https://invoicefu.com/api/accounts/108-cole-mertz-fake/invoices/new?
api_key=ddd349b30b6d9fde97b01b827e6be5ed1e4fbe72&format=xml&debug=1"

<?xml version="1.0" encoding="UTF-8"?>
<errors>
  <error>extra params found: debug. Allowed params are:
account_id,client_id,invoice_id,proforma_id</error>
</errors>


> curl "https://invoicefu.com/api/accounts/108-cole-mertz-fake/invoices/new?
api_key=ddd349b30b6d9fde97b01b827e6be5ed1e4fbe72&format=xml&debug=1&strict=false"
<?xml version="1.0" encoding="UTF-8"?>
<invoice>
  <number>2011/30</number>
  <issued-on>2011-12-11</issued-on>
  <proforma-id nil="true"></proforma-id>
    (...)

 <links>
   (...)

    <link>
      <rel>invoices</rel>
      <uri>https://invoicefu-localhost.com/api/accounts/108-cole-mertz-fake/invoices</uri>
      <methods>GET,POST</methods>
    </link>
  </links>
</invoice>
templates
        for new
       resources
> curl "https://invoicefu.com/api/accounts/108-cole-mertz-fake/invoices/new?
api_key=ddd349b30b6d9fde97b027e6be5ed1e4fbe72&format=json"

{"invoice":{"number":"2011/30","issued_on":"2011-12-
12","proforma_id":null,"notes":null,"footer":null,"locale":"en","currency_code":"USD","currency_sym
bol":"$","ac_name":"Cole-Mertz#FAKE","ac_company_number_name":"Company
number","ac_company_number":"25465828K","ac_tax_number_name":"VAT
Number","ac_tax_number":"ES25464828k","ac_address":"234 brecknock
road","ac_city":"london","ac_province":null,"ac_postal_code":"n18 5bq","ac_country_name":"United
Kingdom","cl_email":null,"cl_name":null,"cl_company_number_name":null,"cl_company_number":null,"cl_
tax_number_name":null,"cl_tax_number":null,"cl_address":null,"cl_city":null,"cl_province":null,"cl_
postal_code":null,"cl_country_name":null,"invoice_lines":[],"discount_percent":null,"tax_lines":
[{"name":"TVA","signed_percent":"19.6"}],"paid":"0.0","links":
[{"rel":"payments","uri":"https://invoicefu.com/api/accounts/108-cole-mertz-
fake/invoices//payments","methods":"POST"},
{"rel":"account","uri":"https://invoicefu.com/api/accounts/108-cole-mertz-
fake","methods":"GET,PUT"},{"rel":"client","uri":null,"methods":"GET,PUT,DELETE"},
{"rel":"proforma","uri":null,"methods":"GET,PUT,DELETE"},{"rel":"pdf","uri":null,"methods":"GET"},
{"rel":"invoices","uri":"https://invoicefu.com/api/accounts/108-cole-mertz-
fake/invoices","methods":"GET,POST"}]}}j
Multiple consumers
All your
 FORMAT
are belong
 to us
*even native formats
javascript revival
Cross origin
resource sharing
use the
                    metadata
                         luke

Permitir cabeceras del tipo
    return-async
    return-representation
    return-minimal

Devolver cabeceras útiles
Respuestas parciales
https://gdata.youtube.com/feeds/api/users/default/uploads?
fields=entry(title,gd:comments,yt:statistics)




fields=entry[link/@rel='http://gdata.youtube.com/schemas/20
07%23mobile']
Implementación en invoicefu
apigee
http://usemyapi.com
 12 mayo 2012
APIs REST
                                           usableS*
                                                      edición codemotion.es

{"links":[
 {"rel":"author",           "uri":"http://javier-ramirez.com"},
 {"rel":"work",             "uri":"http://aspgems.com"},
 {"rel":"blog",             "uri":"http://formatinternet.com"},
 {"rel":"twittEr",          "uri":"http//twitter.com/supercoco9"}
]}
*ningún gatico (ni ningún friki ansioso) ha sido dañado para hacer esta presentación

Mais conteúdo relacionado

Mais procurados (8)

Html5
Html5Html5
Html5
 
Error found
Error foundError found
Error found
 
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Service
Araport Workshop Tutorial 2: Authentication and the Agave Profiles ServiceAraport Workshop Tutorial 2: Authentication and the Agave Profiles Service
Araport Workshop Tutorial 2: Authentication and the Agave Profiles Service
 
Even faster web sites presentation 3
Even faster web sites presentation 3Even faster web sites presentation 3
Even faster web sites presentation 3
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單
 
Penetration Testing with Improved Input Vector Identification
Penetration Testing with Improved Input Vector IdentificationPenetration Testing with Improved Input Vector Identification
Penetration Testing with Improved Input Vector Identification
 
关于 Html5 那点事
关于 Html5 那点事关于 Html5 那点事
关于 Html5 那点事
 
WAI-ARIA is More Than Accessibility
WAI-ARIA is More Than AccessibilityWAI-ARIA is More Than Accessibility
WAI-ARIA is More Than Accessibility
 

Semelhante a APIs REST Usables con Hypermedia por Javier Ramirez, para codemotion

A Practical Guide To Hypermedia APIs - Philly.rb
A Practical Guide To Hypermedia APIs - Philly.rbA Practical Guide To Hypermedia APIs - Philly.rb
A Practical Guide To Hypermedia APIs - Philly.rb
SmartLogic
 

Semelhante a APIs REST Usables con Hypermedia por Javier Ramirez, para codemotion (20)

Restful design at work v2.0
Restful design at work v2.0Restful design at work v2.0
Restful design at work v2.0
 
Design Web Api
Design Web ApiDesign Web Api
Design Web Api
 
RefCard RESTful API Design
RefCard RESTful API DesignRefCard RESTful API Design
RefCard RESTful API Design
 
What is rest. Why is it part of the Rails way?. Railsconf 2014. Javier Ramirez
What is rest. Why is it part of the Rails way?. Railsconf 2014. Javier RamirezWhat is rest. Why is it part of the Rails way?. Railsconf 2014. Javier Ramirez
What is rest. Why is it part of the Rails way?. Railsconf 2014. Javier Ramirez
 
Api development with rails
Api development with railsApi development with rails
Api development with rails
 
Rest ful tools for lazy experts
Rest ful tools for lazy expertsRest ful tools for lazy experts
Rest ful tools for lazy experts
 
RESTFul Tools For Lazy Experts - CFSummit 2016
RESTFul Tools For Lazy Experts - CFSummit 2016RESTFul Tools For Lazy Experts - CFSummit 2016
RESTFul Tools For Lazy Experts - CFSummit 2016
 
Best Practices for Architecting a Pragmatic Web API.
Best Practices for Architecting a Pragmatic Web API.Best Practices for Architecting a Pragmatic Web API.
Best Practices for Architecting a Pragmatic Web API.
 
Workshop KrakYourNet2016 - Web applications hacking Ruby on Rails example
Workshop KrakYourNet2016 - Web applications hacking Ruby on Rails example Workshop KrakYourNet2016 - Web applications hacking Ruby on Rails example
Workshop KrakYourNet2016 - Web applications hacking Ruby on Rails example
 
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails
Hypermedia: The Missing Element to Building Adaptable Web APIs in RailsHypermedia: The Missing Element to Building Adaptable Web APIs in Rails
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails
 
Understanding Identity in the World of Web APIs – Ronnie Mitra, API Architec...
Understanding Identity in the World of Web APIs – Ronnie Mitra,  API Architec...Understanding Identity in the World of Web APIs – Ronnie Mitra,  API Architec...
Understanding Identity in the World of Web APIs – Ronnie Mitra, API Architec...
 
RoR Workshop - Web applications hacking - Ruby on Rails example
RoR Workshop - Web applications hacking - Ruby on Rails exampleRoR Workshop - Web applications hacking - Ruby on Rails example
RoR Workshop - Web applications hacking - Ruby on Rails example
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
 
A Practical Guide To Hypermedia APIs - Philly.rb
A Practical Guide To Hypermedia APIs - Philly.rbA Practical Guide To Hypermedia APIs - Philly.rb
A Practical Guide To Hypermedia APIs - Philly.rb
 
The-Power-Of-Recon (1)-poerfulo.pptx.pdf
The-Power-Of-Recon (1)-poerfulo.pptx.pdfThe-Power-Of-Recon (1)-poerfulo.pptx.pdf
The-Power-Of-Recon (1)-poerfulo.pptx.pdf
 
mashraqi_farhan
mashraqi_farhanmashraqi_farhan
mashraqi_farhan
 
Создание API, которое полюбят разработчики. Глубокое погружение
Создание API, которое полюбят разработчики. Глубокое погружениеСоздание API, которое полюбят разработчики. Глубокое погружение
Создание API, которое полюбят разработчики. Глубокое погружение
 
ApacheCon 2005
ApacheCon 2005ApacheCon 2005
ApacheCon 2005
 
Design Summit - RESTful API Overview - John Hardy
Design Summit - RESTful API Overview - John HardyDesign Summit - RESTful API Overview - John Hardy
Design Summit - RESTful API Overview - John Hardy
 
Building Better Web APIs with Rails
Building Better Web APIs with RailsBuilding Better Web APIs with Rails
Building Better Web APIs with Rails
 

Mais de javier ramirez

Mais de javier ramirez (20)

¿Se puede vivir del open source? T3chfest
¿Se puede vivir del open source? T3chfest¿Se puede vivir del open source? T3chfest
¿Se puede vivir del open source? T3chfest
 
QuestDB: The building blocks of a fast open-source time-series database
QuestDB: The building blocks of a fast open-source time-series databaseQuestDB: The building blocks of a fast open-source time-series database
QuestDB: The building blocks of a fast open-source time-series database
 
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
 
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
 
Deduplicating and analysing time-series data with Apache Beam and QuestDB
Deduplicating and analysing time-series data with Apache Beam and QuestDBDeduplicating and analysing time-series data with Apache Beam and QuestDB
Deduplicating and analysing time-series data with Apache Beam and QuestDB
 
Your Database Cannot Do this (well)
Your Database Cannot Do this (well)Your Database Cannot Do this (well)
Your Database Cannot Do this (well)
 
Your Timestamps Deserve Better than a Generic Database
Your Timestamps Deserve Better than a Generic DatabaseYour Timestamps Deserve Better than a Generic Database
Your Timestamps Deserve Better than a Generic Database
 
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
 
QuestDB-Community-Call-20220728
QuestDB-Community-Call-20220728QuestDB-Community-Call-20220728
QuestDB-Community-Call-20220728
 
Processing and analysing streaming data with Python. Pycon Italy 2022
Processing and analysing streaming  data with Python. Pycon Italy 2022Processing and analysing streaming  data with Python. Pycon Italy 2022
Processing and analysing streaming data with Python. Pycon Italy 2022
 
QuestDB: ingesting a million time series per second on a single instance. Big...
QuestDB: ingesting a million time series per second on a single instance. Big...QuestDB: ingesting a million time series per second on a single instance. Big...
QuestDB: ingesting a million time series per second on a single instance. Big...
 
Servicios e infraestructura de AWS y la próxima región en Aragón
Servicios e infraestructura de AWS y la próxima región en AragónServicios e infraestructura de AWS y la próxima región en Aragón
Servicios e infraestructura de AWS y la próxima región en Aragón
 
Primeros pasos en desarrollo serverless
Primeros pasos en desarrollo serverlessPrimeros pasos en desarrollo serverless
Primeros pasos en desarrollo serverless
 
How AWS is reinventing the cloud
How AWS is reinventing the cloudHow AWS is reinventing the cloud
How AWS is reinventing the cloud
 
Analitica de datos en tiempo real con Apache Flink y Apache BEAM
Analitica de datos en tiempo real con Apache Flink y Apache BEAMAnalitica de datos en tiempo real con Apache Flink y Apache BEAM
Analitica de datos en tiempo real con Apache Flink y Apache BEAM
 
Getting started with streaming analytics
Getting started with streaming analyticsGetting started with streaming analytics
Getting started with streaming analytics
 
Getting started with streaming analytics: Setting up a pipeline
Getting started with streaming analytics: Setting up a pipelineGetting started with streaming analytics: Setting up a pipeline
Getting started with streaming analytics: Setting up a pipeline
 
Getting started with streaming analytics: Deep Dive
Getting started with streaming analytics: Deep DiveGetting started with streaming analytics: Deep Dive
Getting started with streaming analytics: Deep Dive
 
Getting started with streaming analytics: streaming basics (1 of 3)
Getting started with streaming analytics: streaming basics (1 of 3)Getting started with streaming analytics: streaming basics (1 of 3)
Getting started with streaming analytics: streaming basics (1 of 3)
 
Monitorización de seguridad y detección de amenazas con AWS
Monitorización de seguridad y detección de amenazas con AWSMonitorización de seguridad y detección de amenazas con AWS
Monitorización de seguridad y detección de amenazas con AWS
 

Último

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Último (20)

CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 

APIs REST Usables con Hypermedia por Javier Ramirez, para codemotion

  • 1. APIs REST Usables Javier Ramírez @supercoco9 @aspgems
  • 2. APIs REST usableS* edición codemotion.es {"links":[ {"rel":"author", "uri":"http://javier-ramirez.com"}, {"rel":"work", "uri":"http://aspgems.com"}, {"rel":"twittEr", "uri":"http//twitter.com/supercoco9"} {"rel":"api-usable", "uri":"https//invoicefu.com"} ]} *ningún gatico (ni ningún friki ansioso) ha sido dañado para hacer esta presentación
  • 3.
  • 4.
  • 5.
  • 10. 2001
  • 11. La usabilidad Web es un enfoque para construir sitios web faciles de usar ' para un usuario final, sin que se requiera ninguna formacion especializada '
  • 13.
  • 14. API “REST” Hecha con RAILS en lo que se TARDA EN decir constantinopla
  • 15.
  • 17. modelo de recursos Autenticación y (NO) Estado formatos Estados y gestión versionado de errores múltiples analítica consumidores monetización paginación Documentación Escalabilidad first class api? cuotas metadatos … y uSaBiLidAd cachés
  • 18. BASIC ACCESS AUTHENTICATION authenticate_or_request_with_http_basic do |login, password| User.find_by_login_and_password login, password end User and password must be passed every time TOKEN Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join ) User.find_by_login_and_api_key( params[:login], params[:api_key] ) Client can send it as a parameter or as a header OAUTH Depends on third party libraries Requires initial registration of client and more integration
  • 19. SUCCESS consistently fail consistently
  • 20. huddle twitter 200 OK 200 OK Success! 201 Created 304 Not Modified 202 Accepted 400 Bad Request 400 Bad Request 401 Unauthorized 401 403 Forbidden Unauthorized 404 Not Found 403 Forbidden 406 Not Acceptable 404 Not Found 420 Enhance Your Calm 410 Gone invoicefu 500 Internal Server 200 OK Success! Error 201 Created 502 Bad Gateway 304 Not Modified 503 Service Unavailable 401 Unauthorized 404 Not Found Useful Status 422 Unprocessable Entity 429 Too many requests 406 Not Acceptable 204 No Content 500 Internal Server Error
  • 21. Accept: application/vnd.aspgems.invoicefu.v1.xml THE ACCEPT HEADER HTTP/REST Standard Not everyone Less obvious Unambiguous supports headers Harder to use Resources != or custom types. Non standard content- Representations Generic content types Version as you need it types are Skips HTTP server logs preferred
  • 22.
  • 23.
  • 24. REST explicado por un señor que tan listo no será cuando no usa gafas client-server,stateless,layered,cacheable Resources Resource Identifiers Resource metadata Uniform interface operations Representations Representation metadata HATEOAS Optionally: code on demand señor sin gafas
  • 25. INTERFAZ UNIFORME get, HEAD, TRACE, OPTIONS post, put*, delete*, PATCH* *fallbacks para clientes viejos o incompletos
  • 26. here be dragons
  • 28. expose ONLY WHAT IS Strictly necessary
  • 30. Aggregation/ composition Multiple representations
  • 33. curl -X POST "https://invoicefu.com/api/session? format=xml&login=hello@invoicefu.com&password=YAY <?xml version="1.0" encoding="UTF-8"?> <user> <id>3</id> <name>javier ramir</name> <email>javier@formatinternet.com</email> <locale>es</locale> <twitter-nickname>supercoco9</twitter-nickname> <facebook-uid nil="true"></facebook-uid> <facebook-nickname nil="true"></facebook-nickname> <api-key>c23e830d9b092a3a801d7f49b46</api-key> <links> <link> <rel>clients</rel> <uri>https://invoicefu.com/api/accounts/3-javier-ramirez/clients</uri> <methods>GET,POST</methods> </link> <link> <rel>new_client</rel> <uri>https://invoicefu.com/api/accounts/3-javier-ramirez/clients/new</uri> <methods>GET</methods> </link>
  • 34. Rob Eisenberg <productions> <links> <link rel="self" href="..." /> <link rel="next" href="..." /> </links> <production> <name>RavenDB</name> <author>Oren Eini</author> <links> <link rel="self" href="..." /> <link rel="rels/episodes" href="..." /> </links> </production> <production> <name>Art of Speaking</name> <author>Scott Hanselman</author> <links> <link rel="self" href="..." /> <link rel="rels/episodes" href="..." /> </links> </production> <!--other productions elided--> </productions>
  • 35. Mike Kelly { "_links": { "self": { "href": "..." } }, "title": "Real World ASP.NET MVC3", "description": "In this advanced, somewhat-opinionated...", "permitted": true, "_embedded": { "episodes": [{ "_links": { "self": { "href": "..." }, "media": [{ "type": "video/webm; codecs='vp8.0, vorbis'", "href": "..." },{ "type": "video/ogg; codecs='theora, vorbis'", "href": "..." }] }, "title": "Foundations", "description": "In this episode we talk about what it is we're doing: building our startup and getting ourselves off the ground. We take..", "released": 1306972800 }
  • 36. DARREL MILLER { "_links" : { "self" : { "href" : "/user/95/allproductions" }, }, "name" : "Joe", "_embedded" : { "urn:tekpub:production" : [ { "_links": { "self": { "href": "/production/22" }, }, "allowed" : "true", "title" : "Rails runs rings round ReST resource representations" }, { "_links": { "self": { "href": "/production/74" }, }, "allowed" : "false", "title" : "Surfing the waves beats surfing an API" } ] } }
  • 37. ACTS AS API :Filtros
  • 39. > curl "https://invoicefu.com/api/accounts/108-cole-mertz-fake/invoices/new? api_key=ddd349b30b6d9fde97b01b827e6be5ed1e4fbe72&format=xml&debug=1" <?xml version="1.0" encoding="UTF-8"?> <errors> <error>extra params found: debug. Allowed params are: account_id,client_id,invoice_id,proforma_id</error> </errors> > curl "https://invoicefu.com/api/accounts/108-cole-mertz-fake/invoices/new? api_key=ddd349b30b6d9fde97b01b827e6be5ed1e4fbe72&format=xml&debug=1&strict=false" <?xml version="1.0" encoding="UTF-8"?> <invoice> <number>2011/30</number> <issued-on>2011-12-11</issued-on> <proforma-id nil="true"></proforma-id> (...) <links> (...) <link> <rel>invoices</rel> <uri>https://invoicefu-localhost.com/api/accounts/108-cole-mertz-fake/invoices</uri> <methods>GET,POST</methods> </link> </links> </invoice>
  • 40.
  • 41. templates for new resources > curl "https://invoicefu.com/api/accounts/108-cole-mertz-fake/invoices/new? api_key=ddd349b30b6d9fde97b027e6be5ed1e4fbe72&format=json" {"invoice":{"number":"2011/30","issued_on":"2011-12- 12","proforma_id":null,"notes":null,"footer":null,"locale":"en","currency_code":"USD","currency_sym bol":"$","ac_name":"Cole-Mertz#FAKE","ac_company_number_name":"Company number","ac_company_number":"25465828K","ac_tax_number_name":"VAT Number","ac_tax_number":"ES25464828k","ac_address":"234 brecknock road","ac_city":"london","ac_province":null,"ac_postal_code":"n18 5bq","ac_country_name":"United Kingdom","cl_email":null,"cl_name":null,"cl_company_number_name":null,"cl_company_number":null,"cl_ tax_number_name":null,"cl_tax_number":null,"cl_address":null,"cl_city":null,"cl_province":null,"cl_ postal_code":null,"cl_country_name":null,"invoice_lines":[],"discount_percent":null,"tax_lines": [{"name":"TVA","signed_percent":"19.6"}],"paid":"0.0","links": [{"rel":"payments","uri":"https://invoicefu.com/api/accounts/108-cole-mertz- fake/invoices//payments","methods":"POST"}, {"rel":"account","uri":"https://invoicefu.com/api/accounts/108-cole-mertz- fake","methods":"GET,PUT"},{"rel":"client","uri":null,"methods":"GET,PUT,DELETE"}, {"rel":"proforma","uri":null,"methods":"GET,PUT,DELETE"},{"rel":"pdf","uri":null,"methods":"GET"}, {"rel":"invoices","uri":"https://invoicefu.com/api/accounts/108-cole-mertz- fake/invoices","methods":"GET,POST"}]}}j
  • 43. All your FORMAT are belong to us *even native formats
  • 46. use the metadata luke Permitir cabeceras del tipo return-async return-representation return-minimal Devolver cabeceras útiles
  • 47.
  • 48.
  • 52.
  • 54. APIs REST usableS* edición codemotion.es {"links":[ {"rel":"author", "uri":"http://javier-ramirez.com"}, {"rel":"work", "uri":"http://aspgems.com"}, {"rel":"blog", "uri":"http://formatinternet.com"}, {"rel":"twittEr", "uri":"http//twitter.com/supercoco9"} ]} *ningún gatico (ni ningún friki ansioso) ha sido dañado para hacer esta presentación