SlideShare a Scribd company logo
Rest con Python
Lo necesario
Intentar crear un API Rest con Python
Que cumpla con todos los estandares REST
Que sea facil de utilizar y probar
Que sea customizable
Que tenga buena documentacion y soporte
Que utilize y se integre con Mongo facilmente
Lo Necesario
Todo esto en 3 Dias!!!
Introducing!
Introducing Flask!
Flask
Flask
Flask is a microframework for Python based on Werkzeug,
Jinja 2 and good intentions. And before you ask: It's BSD
licensed!
Flask is Fun
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
And Easy to Setup
$ pip install Flask
$ python hello.py
Eve
Python REST API Framework
Powered by Flask, MongoDB, Redis and good
intentions
Eve allows to effortlessly build and deploy
highly customizable, fully featured RESTful
Web Services
Eve is Simple
from eve import Eve
app = Eve()
app.run()
The API is now live, ready to be consumed:
$ curl -i http://example.com/people
HTTP/1.1 200 OK
REST, Flask and MongoDB
REST, Flask and MongoDB supported
Installation
$ pip install eve
$ easy_install eve
Ejemplo
from eve import Eve
app = Eve()
if __name__ == '__main__':
app.run()
Despues creamos un Settings
Creamos un settings.py
DOMAIN = {'people': {}}
Response
{
"_links": {
"child": [
{
"href": "/people",
"title": "people"
}
]
}
}
Now request
$ curl http://127.0.0.1:5000/people
{
"_items": [],
"_links": {
"self": {
"href": "/people",
"title": "people"
},
"parent": {
"href": "",
"title": "home"
}
}
}
HATEOAS
API entry points adhere to the HATEOAS
Hypermedia as the Engine of Application State
(HATEOAS)
HATEOAS
The principle is that a client interacts with a
network application entirely through
hypermedia provided dynamically by
application servers
Database Interlude
# Let's just use the local mongod instance. Edit as needed.
# Please note that MONGO_HOST and MONGO_PORT could very well be left
# out as they already default to a bare bones local 'mongod' instance.
MONGO_HOST = 'localhost'
MONGO_PORT = 27017
MONGO_USERNAME = 'user'
MONGO_PASSWORD = 'user'
MONGO_DBNAME = 'apitest'
A More Complex Application
So far our API has been read-only. Let’s enable the full spectrum of CRUD operations:
# Enable reads (GET), inserts (POST) and DELETE for resources/collections
# (if you omit this line, the API will default to ['GET'] and provide
# read-only access to the endpoint).
RESOURCE_METHODS = ['GET', 'POST', 'DELETE']
# Enable reads (GET), edits (PATCH), replacements (PUT) and deletes of
# individual items (defaults to read-only item access).
ITEM_METHODS = ['GET', 'PATCH', 'PUT', 'DELETE']
Schema
schema = {
# Schema definition, based on Cerberus grammar. Check the Cerberus project
# (https://github.com/nicolaiarocci/cerberus) for details.
'firstname': {
'type': 'string',
'minlength': 1,
'maxlength': 10,
},
'lastname': {
'type': 'string',
'minlength': 1,
'maxlength': 15,
'required': True,
# talk about hard constraints! For the purpose of the demo
# 'lastname' is an API entry-point, so we need it to be unique.
'unique': True,
},
# 'role' is a list, and can only contain values from 'allowed'.
'role': {
'type': 'list',
'allowed': ["author", "contributor", "copy"],
},
# An embedded 'strongly-typed' dictionary.
'location': {
'type': 'dict',
'schema': {
'address': {'type': 'string'},
'city': {'type': 'string'}
},
},
'born': {
'type': 'datetime',
},
}
Better Customization
Now let’s say that we want to further customize the people endpoint
people = {
# 'title' tag used in item links. Defaults to the resource title minus
# the final, plural 's' (works fine in most cases but not for 'people')
'item_title': 'person',
# by default the standard item entry point is defined as
# '/people/<ObjectId>'. We leave it untouched, and we also enable an
# additional read-only entry point. This way consumers can also perform
# GET requests at '/people/<lastname>'.
'additional_lookup': {
'url': 'regex("[w]+")',
'field': 'lastname'
},
# We choose to override global cache-control directives for this resource.
'cache_control': 'max-age=10,must-revalidate',
'cache_expires': 10,
# most global settings can be overridden at resource level
'resource_methods': ['GET', 'POST'],
'schema': schema
}
Features
Lots of features!!!
Full range of CRUD
Action HTTP Verb Context
Create POST Collection
Read GET, HEAD Collection/Document
Update PATCH Document
Replace PUT Document
Delete DELETECollection/Document
More info
Field Description
_created item creation date.
_updated item last updated on.
_etag ETag, to be used for concurrency control and
conditional requests.
_id unique item key, also needed to access the
individual item endpoint.
Sub Resources
Endpoints support sub-resources so you could have something like:/people/<contact_id>/invoices
invoices = {
'url': 'people/<regex("[a-f0-9]{24}"):contact_id>/invoices'
Then this GET to the endpoint, which would roughly translate to give me all the invoices by <contact_id>:
Customizable, item endpoints
Resources can or cannot expose individual item endpoints. API consumers could get access to /people,
/people/<ObjectId> and /people/Doe
$ curl -i http://eve-demo.herokuapp.com/people/521d6840c437dc0002d1203c
HTTP/1.1 200 OK
Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc
Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
$ curl -i http://eve-demo.herokuapp.com/people/Doe
HTTP/1.1 200 OK
Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc
Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
{
"firstname": "John",
"lastname": "Doe",
"born": "Thu, 27 Aug 1970 14:37:13 GMT",
"role": ["author"],
"location": {"city": "Auburn", "address": "422 South Gay Street"},
"_id": "50acfba938345b0978fccad7"
"_updated": "Wed, 21 Nov 2012 16:04:56 GMT",
"_created": "Wed, 21 Nov 2012 16:04:56 GMT",
"_etag": "28995829ee85d69c4c18d597a0f68ae606a266cc",
"_links": {
"self": {"href": "eve-demo.herokuapp.com/people/50acfba938345b0978fccad7", "title": "person"},
"parent": {"href": "eve-demo.herokuapp.com", "title": "home"},
"collection": {"href": "http://eve-demo.herokuapp.com/people", "title": "people"}
}
}
Filtering and Sorting
$ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}
HTTP/1.1 200 OK
Sorting
$ curl -i http://eve-demo.herokuapp.com/people?sort=[("lastname", -1)]
HTTP/1.1 200 OK
Pagination
Resource pagination is enabled by default in order to improve performance and preserve bandwidth
$ curl -i http://eve-demo.herokuapp.com/people?max_results=20&page=2
Mix then all
$ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}&sort=[("firstname", 1)]&page=5
JSON and XML Rendering
Eve responses are automatically rendered as JSON (the default) or XML, depending on the request Accept
header. Inbound documents (for inserts and edits) are in JSON format.
XML
$ curl -H "Accept: application/xml" -i http://eve-demo.herokuapp.com
<resource>
<link rel="child" href="eve-demo.herokuapp.com/people" title="people" />
<link rel="child" href="eve-demo.herokuapp.com/works" title="works" />
</resource>
Data Integrity and Control
{
"_status": "OK",
"_updated": "Fri, 23 Nov 2012 08:11:19 GMT",
"_id": "50adfa4038345b1049c88a37",
"_etag": "372fbbebf54dfe61742556f17a8461ca9a6f5a11"
"_links": {"self": "..."}
}
$ curl -H "If-Match: 80b81f314712932a4d4ea75ab0b76a4eea613012" -X PATCH -i http://eve-
demo.herokuapp.com/people/50adfa4038345b1049c88a37 -d '{"firstname": "ronald"}'
Bulk Inserts
$ curl -d '{"firstname": "barack", "lastname": "obama"}' -H 'Content-Type: application/json'
http://eve-demo.herokuapp.com/people
HTTP/1.1 201 OK
In this case the response payload will just contain the relevant document metadata:
{
"_status": "OK",
"_updated": "Thu, 22 Nov 2012 15:22:27 GMT",
"_id": "50ae43339fa12500024def5b",
"_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c"
"_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b",
"title": "person"}}
}
$ curl -d '[{"firstname": "barack", "lastname": "obama"}, {"firstname": "mitt", "lastname": "romney"}]' -H
'Content-Type: application/json' http://eve-demo.herokuapp.com/people
HTTP/1.1 201 OK
{
"_status": "OK",
"_items": [
{
"_status": "OK",
"_updated": "Thu, 22 Nov 2012 15:22:27 GMT",
"_id": "50ae43339fa12500024def5b",
"_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c"
"_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b", "title":
"person"}}
},
{
"_status": "OK",
"_updated": "Thu, 22 Nov 2012 15:22:27 GMT",
"_id": "50ae43339fa12500024def5c",
"_etag": "62d356f623c7d9dc864ffa5facc47dced4ba6907"
"_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5c", "title":
"person"}}
}
]
}
Data Validation
{
"_status": "ERR",
"_error": "Some documents contains errors",
"_items": [
{
"_status": "ERR",
"_issues": {"lastname": "value 'clinton' not unique"}
},
{
"_status": "OK",
}
]
]
Authentication
Customizable Basic Authentication (RFC-2617), Token-based authentication and HMAC-based Authentication
are supported.
You can lockdown the whole API, or just some endpoints
. You can also restrict CRUD commands, like allowing open read-only access while restricting edits, inserts
and deletes to authorized users. Role-based access control is supported as well
Read-only by default
If all you need is a read-only API, then you can have it up and running in a matter of minutes.
Projections
curl -i http://eve-demo.herokuapp.com/people?projection={"lastname": 1, "born": 1}
$ curl -i http://eve-demo.herokuapp.com/people?projection={"born": 0}
Embedded Resource
DOMAIN = {
'emails': {
'schema': {
'author': {
'type': 'objectid',
'data_relation': {
'resource': 'users',
'field': '_id',
'embeddable': True
},
},
'subject': {'type': 'string'},
'body': {'type': 'string'},
}
}
Event Hooks
>>> def pre_get_callback(resource, request, lookup):
... print 'A GET request on the "%s" endpoint has just been received!' % resource
>>> def pre_contacts_get_callback(request, lookup):
... print 'A GET request on the contacts endpoint has just been received!'
>>> app = Eve()
>>> app.on_pre_GET += pre_get_callback
>>> app.on_pre_GET_contacts += pre_contacts_get_callback
>>> app.run()
Post-Request Event Hooks
>>> def post_get_callback(resource, request, payload):
... print 'A GET on the "%s" endpoint was just performed!' % resource
>>> def post_contacts_get_callback(request, payload):
... print 'A get on "contacts" was just performed!'
>>> app = Eve()
>>> app.on_post_GET += post_get_callback
>>> app.on_post_GET_contacts += post_contacts_get_callback
>>> app.run()
Database event hooks
>>> def add_signature(resource, response):
... response['SIGNATURE'] = "A %s from eve" % resource
>>> app = Eve()
>>> app.on_fetched_item += add_signature
ETC...
Rate Limiting
X-RateLimit-Remaining: 299
X-RateLimit-Limit: 300
X-RateLimit-Reset: 1370940300
File Storage
Media files (images, pdf, etc.) can be uploaded as media document fields. Upload is done via POST, PUT and PATCH
as usual, but using the multipart/data-form content-type.
accounts = {
'name': {'type': 'string'},
'pic': {'type': 'media'},
...
}
$ curl -F "name=john" -F "pic=@profile.jpg" http://example.com/accounts
{
'_items': [
{
'_updated':'Sat, 05 Apr 2014 15:52:53 GMT',
'pic':'iVBORw0KGgoAAAANSUhEUgAAA4AAAAOACA...',
}
]
...
}
Ejemplos

More Related Content

What's hot (20)

KEY
Zendcon 09
Wade Arnold
 
PPTX
Python Code Camp for Professionals 3/4
DEVCON
 
PDF
Beyond Phoenix
Gabriele Lana
 
PPTX
Python Code Camp for Professionals 4/4
DEVCON
 
PDF
Rest api with Python
Santosh Ghimire
 
PDF
RESTful Web API and MongoDB go for a pic nic
Nicola Iarocci
 
PDF
Python RESTful webservices with Python: Flask and Django solutions
Solution4Future
 
PDF
Ruby gems
Papp Laszlo
 
PDF
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
CodeCore
 
PDF
Burn down the silos! Helping dev and ops gel on high availability websites
Lindsay Holmwood
 
PPTX
CouchDB Day NYC 2017: Mango
IBM Cloud Data Services
 
PDF
Flask - Backend com Python - Semcomp 18
Lar21
 
PDF
Django - 次の一歩 gumiStudy#3
makoto tsuyuki
 
ODP
My app is secure... I think
Wim Godden
 
PDF
Postman On Steroids
Sara Tornincasa
 
PDF
Lies, Damn Lies, and Benchmarks
Workhorse Computing
 
PDF
Fun with Python
Narong Intiruk
 
PDF
A Little Backbone For Your App
Luca Mearelli
 
PDF
Introduction to Nodejs
Gabriele Lana
 
PDF
Stop Worrying & Love the SQL - A Case Study
All Things Open
 
Zendcon 09
Wade Arnold
 
Python Code Camp for Professionals 3/4
DEVCON
 
Beyond Phoenix
Gabriele Lana
 
Python Code Camp for Professionals 4/4
DEVCON
 
Rest api with Python
Santosh Ghimire
 
RESTful Web API and MongoDB go for a pic nic
Nicola Iarocci
 
Python RESTful webservices with Python: Flask and Django solutions
Solution4Future
 
Ruby gems
Papp Laszlo
 
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
CodeCore
 
Burn down the silos! Helping dev and ops gel on high availability websites
Lindsay Holmwood
 
CouchDB Day NYC 2017: Mango
IBM Cloud Data Services
 
Flask - Backend com Python - Semcomp 18
Lar21
 
Django - 次の一歩 gumiStudy#3
makoto tsuyuki
 
My app is secure... I think
Wim Godden
 
Postman On Steroids
Sara Tornincasa
 
Lies, Damn Lies, and Benchmarks
Workhorse Computing
 
Fun with Python
Narong Intiruk
 
A Little Backbone For Your App
Luca Mearelli
 
Introduction to Nodejs
Gabriele Lana
 
Stop Worrying & Love the SQL - A Case Study
All Things Open
 

Viewers also liked (13)

PDF
Aplicando controles de segurança em API’s, por Erick Tedeschi
iMasters
 
PPTX
An introduction to Mobile Development (Spanish)
PiXeL16
 
PPTX
Indoor Positioning System with iBeacons
PiXeL16
 
PPTX
iOS 7
PiXeL16
 
PPTX
WWDC 2014
PiXeL16
 
PPTX
Deferred object
PiXeL16
 
PPTX
The Internet own boy
PiXeL16
 
PPTX
Unit testing
PiXeL16
 
PPTX
WWDC 2016
PiXeL16
 
PPTX
Mobile architecture problems and solutions.
PiXeL16
 
PPTX
Hooked - How to build habit forming products
PiXeL16
 
PDF
Rest Introduction (Chris Jimenez)
PiXeL16
 
PDF
Developing RESTful Web APIs with Python, Flask and MongoDB
Nicola Iarocci
 
Aplicando controles de segurança em API’s, por Erick Tedeschi
iMasters
 
An introduction to Mobile Development (Spanish)
PiXeL16
 
Indoor Positioning System with iBeacons
PiXeL16
 
iOS 7
PiXeL16
 
WWDC 2014
PiXeL16
 
Deferred object
PiXeL16
 
The Internet own boy
PiXeL16
 
Unit testing
PiXeL16
 
WWDC 2016
PiXeL16
 
Mobile architecture problems and solutions.
PiXeL16
 
Hooked - How to build habit forming products
PiXeL16
 
Rest Introduction (Chris Jimenez)
PiXeL16
 
Developing RESTful Web APIs with Python, Flask and MongoDB
Nicola Iarocci
 
Ad

Similar to REST with Eve and Python (20)

PPT
RESTful SOA - 中科院暑期讲座
Li Yi
 
PPTX
RestfulDesignRules
Michael De Courci
 
PDF
REST in pieces
sparkfabrik
 
PDF
[drupalday2017] - REST in pieces
DrupalDay
 
PDF
Building sustainable RESTFul services
Ortus Solutions, Corp
 
PPT
Intro to CloudStack API
Sebastien Goasguen
 
PDF
distributing over the web
Nicola Baldi
 
PPTX
Rest APIs Training
Shekhar Kumar
 
PDF
ERRest: the Basics
WO Community
 
PPTX
A Deep Dive into RESTful API Design Part 2
VivekKrishna34
 
PDF
REST easy with API Platform
Antonio Peric-Mazar
 
PDF
REST API Basics
Tharindu Weerasinghe
 
PPTX
Rest Essentials
Sergey Podolsky
 
PDF
Creating Restful Web Services with restish
Grig Gheorghiu
 
PPTX
Standards of rest api
Maýur Chourasiya
 
PDF
Cqrs api v2
Brandon Mueller
 
PDF
Writing RESTful Web Services
Paul Boocock
 
PPTX
Rest with Java EE 6 , Security , Backbone.js
Carol McDonald
 
PPTX
Rest
Carol McDonald
 
RESTful SOA - 中科院暑期讲座
Li Yi
 
RestfulDesignRules
Michael De Courci
 
REST in pieces
sparkfabrik
 
[drupalday2017] - REST in pieces
DrupalDay
 
Building sustainable RESTFul services
Ortus Solutions, Corp
 
Intro to CloudStack API
Sebastien Goasguen
 
distributing over the web
Nicola Baldi
 
Rest APIs Training
Shekhar Kumar
 
ERRest: the Basics
WO Community
 
A Deep Dive into RESTful API Design Part 2
VivekKrishna34
 
REST easy with API Platform
Antonio Peric-Mazar
 
REST API Basics
Tharindu Weerasinghe
 
Rest Essentials
Sergey Podolsky
 
Creating Restful Web Services with restish
Grig Gheorghiu
 
Standards of rest api
Maýur Chourasiya
 
Cqrs api v2
Brandon Mueller
 
Writing RESTful Web Services
Paul Boocock
 
Rest with Java EE 6 , Security , Backbone.js
Carol McDonald
 
Ad

Recently uploaded (20)

PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
PDF
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 

REST with Eve and Python

  • 2. Lo necesario Intentar crear un API Rest con Python Que cumpla con todos los estandares REST Que sea facil de utilizar y probar Que sea customizable Que tenga buena documentacion y soporte Que utilize y se integre con Mongo facilmente
  • 3. Lo Necesario Todo esto en 3 Dias!!!
  • 6. Flask Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. And before you ask: It's BSD licensed!
  • 7. Flask is Fun from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
  • 8. And Easy to Setup $ pip install Flask $ python hello.py
  • 9. Eve
  • 10. Python REST API Framework Powered by Flask, MongoDB, Redis and good intentions Eve allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services
  • 11. Eve is Simple from eve import Eve app = Eve() app.run()
  • 12. The API is now live, ready to be consumed: $ curl -i http://example.com/people HTTP/1.1 200 OK
  • 13. REST, Flask and MongoDB REST, Flask and MongoDB supported
  • 14. Installation $ pip install eve $ easy_install eve
  • 15. Ejemplo from eve import Eve app = Eve() if __name__ == '__main__': app.run()
  • 16. Despues creamos un Settings Creamos un settings.py DOMAIN = {'people': {}}
  • 17. Response { "_links": { "child": [ { "href": "/people", "title": "people" } ] } }
  • 18. Now request $ curl http://127.0.0.1:5000/people { "_items": [], "_links": { "self": { "href": "/people", "title": "people" }, "parent": { "href": "", "title": "home" } } }
  • 19. HATEOAS API entry points adhere to the HATEOAS Hypermedia as the Engine of Application State (HATEOAS)
  • 20. HATEOAS The principle is that a client interacts with a network application entirely through hypermedia provided dynamically by application servers
  • 21. Database Interlude # Let's just use the local mongod instance. Edit as needed. # Please note that MONGO_HOST and MONGO_PORT could very well be left # out as they already default to a bare bones local 'mongod' instance. MONGO_HOST = 'localhost' MONGO_PORT = 27017 MONGO_USERNAME = 'user' MONGO_PASSWORD = 'user' MONGO_DBNAME = 'apitest'
  • 22. A More Complex Application So far our API has been read-only. Let’s enable the full spectrum of CRUD operations: # Enable reads (GET), inserts (POST) and DELETE for resources/collections # (if you omit this line, the API will default to ['GET'] and provide # read-only access to the endpoint). RESOURCE_METHODS = ['GET', 'POST', 'DELETE'] # Enable reads (GET), edits (PATCH), replacements (PUT) and deletes of # individual items (defaults to read-only item access). ITEM_METHODS = ['GET', 'PATCH', 'PUT', 'DELETE']
  • 23. Schema schema = { # Schema definition, based on Cerberus grammar. Check the Cerberus project # (https://github.com/nicolaiarocci/cerberus) for details. 'firstname': { 'type': 'string', 'minlength': 1, 'maxlength': 10, }, 'lastname': { 'type': 'string', 'minlength': 1, 'maxlength': 15, 'required': True, # talk about hard constraints! For the purpose of the demo # 'lastname' is an API entry-point, so we need it to be unique. 'unique': True, },
  • 24. # 'role' is a list, and can only contain values from 'allowed'. 'role': { 'type': 'list', 'allowed': ["author", "contributor", "copy"], }, # An embedded 'strongly-typed' dictionary. 'location': { 'type': 'dict', 'schema': { 'address': {'type': 'string'}, 'city': {'type': 'string'} }, }, 'born': { 'type': 'datetime', }, }
  • 25. Better Customization Now let’s say that we want to further customize the people endpoint people = { # 'title' tag used in item links. Defaults to the resource title minus # the final, plural 's' (works fine in most cases but not for 'people') 'item_title': 'person', # by default the standard item entry point is defined as # '/people/<ObjectId>'. We leave it untouched, and we also enable an # additional read-only entry point. This way consumers can also perform # GET requests at '/people/<lastname>'. 'additional_lookup': { 'url': 'regex("[w]+")', 'field': 'lastname' },
  • 26. # We choose to override global cache-control directives for this resource. 'cache_control': 'max-age=10,must-revalidate', 'cache_expires': 10, # most global settings can be overridden at resource level 'resource_methods': ['GET', 'POST'], 'schema': schema }
  • 28. Full range of CRUD Action HTTP Verb Context Create POST Collection Read GET, HEAD Collection/Document Update PATCH Document Replace PUT Document Delete DELETECollection/Document
  • 29. More info Field Description _created item creation date. _updated item last updated on. _etag ETag, to be used for concurrency control and conditional requests. _id unique item key, also needed to access the individual item endpoint.
  • 30. Sub Resources Endpoints support sub-resources so you could have something like:/people/<contact_id>/invoices invoices = { 'url': 'people/<regex("[a-f0-9]{24}"):contact_id>/invoices' Then this GET to the endpoint, which would roughly translate to give me all the invoices by <contact_id>:
  • 31. Customizable, item endpoints Resources can or cannot expose individual item endpoints. API consumers could get access to /people, /people/<ObjectId> and /people/Doe $ curl -i http://eve-demo.herokuapp.com/people/521d6840c437dc0002d1203c HTTP/1.1 200 OK Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT $ curl -i http://eve-demo.herokuapp.com/people/Doe HTTP/1.1 200 OK Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
  • 32. { "firstname": "John", "lastname": "Doe", "born": "Thu, 27 Aug 1970 14:37:13 GMT", "role": ["author"], "location": {"city": "Auburn", "address": "422 South Gay Street"}, "_id": "50acfba938345b0978fccad7" "_updated": "Wed, 21 Nov 2012 16:04:56 GMT", "_created": "Wed, 21 Nov 2012 16:04:56 GMT", "_etag": "28995829ee85d69c4c18d597a0f68ae606a266cc", "_links": { "self": {"href": "eve-demo.herokuapp.com/people/50acfba938345b0978fccad7", "title": "person"}, "parent": {"href": "eve-demo.herokuapp.com", "title": "home"}, "collection": {"href": "http://eve-demo.herokuapp.com/people", "title": "people"} } }
  • 33. Filtering and Sorting $ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"} HTTP/1.1 200 OK
  • 34. Sorting $ curl -i http://eve-demo.herokuapp.com/people?sort=[("lastname", -1)] HTTP/1.1 200 OK
  • 35. Pagination Resource pagination is enabled by default in order to improve performance and preserve bandwidth $ curl -i http://eve-demo.herokuapp.com/people?max_results=20&page=2
  • 36. Mix then all $ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}&sort=[("firstname", 1)]&page=5
  • 37. JSON and XML Rendering Eve responses are automatically rendered as JSON (the default) or XML, depending on the request Accept header. Inbound documents (for inserts and edits) are in JSON format.
  • 38. XML $ curl -H "Accept: application/xml" -i http://eve-demo.herokuapp.com <resource> <link rel="child" href="eve-demo.herokuapp.com/people" title="people" /> <link rel="child" href="eve-demo.herokuapp.com/works" title="works" /> </resource>
  • 39. Data Integrity and Control { "_status": "OK", "_updated": "Fri, 23 Nov 2012 08:11:19 GMT", "_id": "50adfa4038345b1049c88a37", "_etag": "372fbbebf54dfe61742556f17a8461ca9a6f5a11" "_links": {"self": "..."} }
  • 40. $ curl -H "If-Match: 80b81f314712932a4d4ea75ab0b76a4eea613012" -X PATCH -i http://eve- demo.herokuapp.com/people/50adfa4038345b1049c88a37 -d '{"firstname": "ronald"}'
  • 41. Bulk Inserts $ curl -d '{"firstname": "barack", "lastname": "obama"}' -H 'Content-Type: application/json' http://eve-demo.herokuapp.com/people HTTP/1.1 201 OK In this case the response payload will just contain the relevant document metadata: { "_status": "OK", "_updated": "Thu, 22 Nov 2012 15:22:27 GMT", "_id": "50ae43339fa12500024def5b", "_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c" "_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b", "title": "person"}} }
  • 42. $ curl -d '[{"firstname": "barack", "lastname": "obama"}, {"firstname": "mitt", "lastname": "romney"}]' -H 'Content-Type: application/json' http://eve-demo.herokuapp.com/people HTTP/1.1 201 OK { "_status": "OK", "_items": [ { "_status": "OK", "_updated": "Thu, 22 Nov 2012 15:22:27 GMT", "_id": "50ae43339fa12500024def5b", "_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c" "_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b", "title": "person"}} },
  • 43. { "_status": "OK", "_updated": "Thu, 22 Nov 2012 15:22:27 GMT", "_id": "50ae43339fa12500024def5c", "_etag": "62d356f623c7d9dc864ffa5facc47dced4ba6907" "_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5c", "title": "person"}} } ] }
  • 44. Data Validation { "_status": "ERR", "_error": "Some documents contains errors", "_items": [ { "_status": "ERR", "_issues": {"lastname": "value 'clinton' not unique"} }, { "_status": "OK", } ] ]
  • 45. Authentication Customizable Basic Authentication (RFC-2617), Token-based authentication and HMAC-based Authentication are supported. You can lockdown the whole API, or just some endpoints . You can also restrict CRUD commands, like allowing open read-only access while restricting edits, inserts and deletes to authorized users. Role-based access control is supported as well
  • 46. Read-only by default If all you need is a read-only API, then you can have it up and running in a matter of minutes.
  • 48. $ curl -i http://eve-demo.herokuapp.com/people?projection={"born": 0}
  • 49. Embedded Resource DOMAIN = { 'emails': { 'schema': { 'author': { 'type': 'objectid', 'data_relation': { 'resource': 'users', 'field': '_id', 'embeddable': True }, }, 'subject': {'type': 'string'}, 'body': {'type': 'string'}, } }
  • 50. Event Hooks >>> def pre_get_callback(resource, request, lookup): ... print 'A GET request on the "%s" endpoint has just been received!' % resource >>> def pre_contacts_get_callback(request, lookup): ... print 'A GET request on the contacts endpoint has just been received!' >>> app = Eve() >>> app.on_pre_GET += pre_get_callback >>> app.on_pre_GET_contacts += pre_contacts_get_callback >>> app.run()
  • 51. Post-Request Event Hooks >>> def post_get_callback(resource, request, payload): ... print 'A GET on the "%s" endpoint was just performed!' % resource >>> def post_contacts_get_callback(request, payload): ... print 'A get on "contacts" was just performed!' >>> app = Eve() >>> app.on_post_GET += post_get_callback >>> app.on_post_GET_contacts += post_contacts_get_callback >>> app.run()
  • 52. Database event hooks >>> def add_signature(resource, response): ... response['SIGNATURE'] = "A %s from eve" % resource >>> app = Eve() >>> app.on_fetched_item += add_signature
  • 55. File Storage Media files (images, pdf, etc.) can be uploaded as media document fields. Upload is done via POST, PUT and PATCH as usual, but using the multipart/data-form content-type. accounts = { 'name': {'type': 'string'}, 'pic': {'type': 'media'}, ... }
  • 56. $ curl -F "name=john" -F "[email protected]" http://example.com/accounts { '_items': [ { '_updated':'Sat, 05 Apr 2014 15:52:53 GMT', 'pic':'iVBORw0KGgoAAAANSUhEUgAAA4AAAAOACA...', } ] ... }