Bio Medical Waste Management Guideliness 2023 ppt.pptx
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folks
1. HTTP et Architectures Orientées Web
Nicolas Martignole
CTO CaptainDash
@nmartignole
Devoxx Maroc 2015
Quentin Adam
CEO CleverCloud
@waxze
Une histoire d’HTTP, des effets spéciaux, des bonnes pratiques d’un design d’API REST,
et en terminant par HTTP/2
26. Exemple POST
POST /cfp/profile/saveProfile HTTP/1.1
Authorization: Basic xxxx
Host: cfp.devoxx.fr
Content-Length: 25
Content-Type: application/x-www-form-urlencoded
email=nicolas%40devoxx.fr
27. Exemple PUT
PUT /cfp/profile/nicolas HTTP/1.1
Authorization: Basic xxxx
Host: cfp.devoxx.fr
Content-Length: 55
Accept: application/json
{
"id":212340,
"email": "nicolas@devoxx.fr"
}
POST : URI est la ressource qui accepte les
données
PUT : entité qui doit être modifié
29. Response
HTTP/1.1 201 Created
Date: Mon, 09 Dec 2013 11:22:00 GMT
Content-Length: 1200
Location: http://cfp.devoxx.fr/profiles/profile/nicolas
30. Status code
• 2xx : OK
• 3xx : Not here
• 4xx : Client screwed up
• 5xx : Server screwed up
31. Status code
201 Created
202 Accepted
206 Partial Content
301 Moved permanently
303 See Other
304 Not Modified
400 Bad Request
401 Unauthorized
404 Not Found
406 Not Acceptable
409 Conflict
412 Precondition Failed
417 Expectation Failed
43. Exemple simple ETag
HTTP/1.1 200 Ok
Age: 0
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 08 Jan 2014 12:25:10 GMT
ETag: 1s76wo-1503
Connection: keep-alive
<! DOCTYPE html>
<html>…..
</html>
GET /from-paris/quality HTTP/1.1
Host: cfp.devoxx.fr
44. Exemple simple ETag : je reviens te voir
GET /from-paris/quality HTTP/1.1
Host: cfp.devoxx.fr
If-None-Match: 1s76wo-1503
45. Exemple simple : la page n’a pas changé
HTTP/1.1 304 Not Modified
Accept-Ranges: bytes
Age: 0
Content-length: 0
Date: Wed, 08 Jan 2014 12:29:17 GMT
Connection: keep-alive
GET /from-paris/quality HTTP/1.1
Host: cfp.devoxx.fr
If-None-Match: 1s76wo-1503
46. Exemple avec Devoxx France
• Afficher une page programme de conférence
• Liste des conférences
• Pour chaque conférence, le nom et la bio du présentateur
47. ETag
• Charge la liste des conférences, et pour chaque conférence, les détails des
présentateurs.
Requête
Liste des Conférences
1. charge les conférences
2. charge les speakers
3. retourne la réponse
53 KB - 140ms
GET /conferences HTTP/1.1
Host: cfp.devoxx.fr
48. ETag
• La page liste des conférences est coûteuse à calculer
2kB - 30ms
49KB- 110ms
Liste des Conférences
1. charge les conférences
2. charge les speakers
3. retourne la réponse
«La liste des conférences détermine la liste des speakers»
49. ETag
• Opérations et transferts inutiles
Requête
Réponse
51 KB - 140ms
Liste des Conférences
1. charge les conférences
2. charge les speakers
3. retourne la réponse
51. ETag
• Si pas de ETag (première visite)
Requête
Liste des Conférences
1. charge la liste des
conférences
2. charge les speakers
3. retourne la réponse
avec
ETag calculé sur la liste
des conférences
Réponse
HTTP/1.1 200 Ok
...
ETag: safik20-demo123
...
52. ETag
• 2ème visite, présente l’entête If-None-Match
Requête
Liste des Conférences
1. charge les conférences
2. calcule ETag
3. si ETag est identique à
celui présenté dans If-
None-Match alors
retourne 304 Not Modified
Réponse
HTTP/1.1 304 Not Modified
ETag: safik20-demo123
Content-Length: 0
GET /conferences HTTP/1.1
Host: cfp.devoxx.fr
If-None-Match: safik20-demo123
2 KB - 15ms
Ne charge pas
la liste des
speakers !
53. ETag (et si la liste des conférences est modifié ?)
• 2ème visite, présente l’entête If-None-Match
Requête
Liste des Conférences
1. charge les conférences
2. calcule ETag
3. si ETag est différent à
celui présenté dans If-
None-Match alors
3.a) charge speakers
3.b) retourne résultat avec
nouvel ETag
Réponse
HTTP/1.1 200 Ok
ETag: ttg234-hgd789
Cache-Control: no-cache
Content-Length: 1429
Content-Type: text/html
GET /conferences HTTP/1.1
Host: cfp.devoxx.fr
If-None-Match: safik20-demo123
53 KB - 140ms
54. ETag
• Résumé
Liste des Conférences
1. charge les conférences
2. calcule ETag sur la liste des conférences
3. compare ce ETag avec If-None-Match si présent
4.a - si identique, retourne 304 Not Modified
4.b - si différent, charge les speakers, puis retourne 200
Ok + ETag
4.c - si pas de If-None-Match dans la requête alors
retourne 200 Ok + ETag
55. Bénéfices
• Eviter des appels coûteux ou lents
• Economie de ressources
• Améliore les temps de réponse
• Simple
56. ETag - Avancé
• Permet d’effacer un élément précis
Requête
Liste des Conférences
Réponse
HTTP/1.1 428 Precondition Required
Date: Wed, 14 Sep 2013 14:01:00
DELETE /conf/proposal/02 HTTP/1.1
Host: cfp.devoxx.fr
57. ETag - Avancé
• Permet d’effacer un élément précis
Requête
Liste des Conférences
Réponse
HTTP/1.1 204 No Content
Date: Wed, 14 Sep 2013 14:01:00
DELETE /conf/proposal/02 HTTP/1.1
Host: cfp.devoxx.fr
If-Match: 120sg-demo123
58. ETag - Avancé
• Permet d’effacer un élément précis
Requête
Liste des Conférences
Réponse
HTTP/1.1 404 Not Found
Date: Wed, 14 Sep 2013 14:01:00
DELETE /conf/proposal/02 HTTP/1.1
Host: cfp.devoxx.fr
If-Match: 120sg-demo123
93. Une API Web
• un namespace/un domaine
• un ensemble de ressources
• des paramètres
94. Le plus gros soucis souvent rencontré
• Construire une API Web est loin d’être simple
• Le couplage afférent entre le client et le serveur est le souci numéro 1
GET /posts/createNew
POST /myapp/doSomething/index.jsf
95. Exemples
• Hypermedia API : une API Web avec l’expérience d’un site Web
• Pas de connaissances contractuelles entre le client et le serveur à priori
• Exemples : https://api.github.com/
96. Exemple sur l’API REST du CFP de Devoxx Maroc
• Utiliser Postman sur Chrome
• cfp.devoxx.ma/api
98. https://api.github.com/users/nicmarti
{
login: nicmarti,
id: 157075,
avatar_url: https://gravatar.com/avatar/09b788738dcb5d36dbd782db5ad66304?d=https%3A%2F%2Fidenticons.github.com
%2Ff406ed0654d6234aa9eb283c4e5b02f2.pngr=x,
gravatar_id: 09b788738dcb5d36dbd782db5ad66304,
url: https://api.github.com/users/nicmarti,
html_url: https://github.com/nicmarti,
followers_url: https://api.github.com/users/nicmarti/followers,
following_url: https://api.github.com/users/nicmarti/following{/other_user},
gists_url: https://api.github.com/users/nicmarti/gists{/gist_id},
starred_url: https://api.github.com/users/nicmarti/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/nicmarti/subscriptions,
organizations_url: https://api.github.com/users/nicmarti/orgs,
repos_url: https://api.github.com/users/nicmarti/repos,
events_url: https://api.github.com/users/nicmarti/events{/privacy},
received_events_url: https://api.github.com/users/nicmarti/received_events,
type: User,
site_admin: false,
name: Nicolas Martignole,
company: Le Touilleur Express,
blog: http://www.touilleur-express.fr,
location: Paris, France,
email: nicolas@touilleur-express.fr,
hireable: true,
bio: Nicolas is a freelancer, based in Paris France.rnHe is first a Web developer, someone that is able to build a Web
application with Java, Scala or Groovy like its job board www.express-board.fr. rnrnHe's the co-funder of Devoxx France, a
conference for developers in Paris, in April 2012. He is also a member of the Paris JUG.rnrnYou can read his blog Le
Touilleur Express http://www.touilleur-express.fr and follow-him on Twitter @nmartignole,
public_repos: 21,
public_gists: 16,
followers: 94,
following: 3,
99. https://api.github.com/users/nicmarti
{
login: nicmarti,
id: 157075,
avatar_url: https://gravatar.com/avatar/09b788738dcb5d36dbd782db5ad66304?d=https%3A%2F%2Fidenticons.github.com
%2Ff406ed0654d6234aa9eb283c4e5b02f2.pngr=x,
gravatar_id: 09b788738dcb5d36dbd782db5ad66304,
url: https://api.github.com/users/nicmarti,
html_url: https://github.com/nicmarti,
followers_url: https://api.github.com/users/nicmarti/followers,
following_url: https://api.github.com/users/nicmarti/following{/other_user},
gists_url: https://api.github.com/users/nicmarti/gists{/gist_id},
starred_url: https://api.github.com/users/nicmarti/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/nicmarti/subscriptions,
organizations_url: https://api.github.com/users/nicmarti/orgs,
repos_url: https://api.github.com/users/nicmarti/repos,
events_url: https://api.github.com/users/nicmarti/events{/privacy},
received_events_url: https://api.github.com/users/nicmarti/received_events,
type: User,
site_admin: false,
name: Nicolas Martignole,
company: Le Touilleur Express,
blog: http://www.touilleur-express.fr,
location: Paris, France,
email: nicolas@touilleur-express.fr,
hireable: true,
bio: Nicolas is a freelancer, based in Paris France.rnHe is first a Web developer, someone that is able to build a
Web application with Java, Scala or Groovy like its job board www.express-board.fr. rnrnHe's the co-funder of Devoxx
France, a conference for developers in Paris, in April 2012. He is also a member of the Paris JUG.rnrnYou can read his
blog Le Touilleur Express http://www.touilleur-express.fr and follow-him on Twitter @nmartignole,
public_repos: 21,
public_gists: 16,
followers: 94,
following: 3,
created_at: 2009-11-23T15:09:57Z,
updated_at: 2014-01-05T16:58:14Z
}
100. HATEOAS
• Hypermedia as the engine of application state
• chaque ressource décrit ses possibilités et ses relations
Ticket «Nouveau»
- soumettre
- effacer
Ticket «Envoyé»
- annuler envoi
- effacer
Ticket «Effacé»
101. HATEOAS
• Relations entre les ressources
root
id q0 /id
link rel = q1 uri = ... /
link rel = q2 uri = ... /
/root
root
id q1 /id
link rel = q0 uri = ... /
link rel = q3 uri = ... /
/root
103. Modèle de maturité de Leonard Richardson
• Comprendre les pratiques d’architecture pour construire une API WEB REST «pure»
104. Niveau 0 de l’API Web
• SOAP, WebServices, les machins des années 2000
Voir http://martinfowler.com/articles/richardsonMaturityModel.html
105. Niveau 0 de l’API Web
Voir http://martinfowler.com/articles/richardsonMaturityModel.html
POST /appointmentService HTTP/1.1
[various other headers]
openSlotRequest date = 2010-01-04 doctor = mjones/
HTTP/1.1 200 OK
[various headers]
openSlotList
slot start = 1400 end = 1450
doctor id = mjones/
/slot
/openSlotList
POST /appointmentService HTTP/1.1
[various other headers]
appointmentRequest
slot doctor = mjones start = 1400 end = 1450/
patient id = nmartignole/
/appointmentRequest HTTP/1.1 200 OK
[various headers]
appointment
slot doctor = mjones start = 1400 end = 1450/
patient id = nmartignole/
/appointment
HTTP/1.1 200 OK
[various headers]
appointmentRequestFailure
slot doctor = mjones start = 1400 end = 1450/
patient id = nmartignole/
reasonSlot not available/reason
/appointmentRequestFailure
106. Niveau 1 - utilisation des Ressources
• Requêtes à différentes ressources
107. Niveau 1 - utilisation des Ressources
POST /doctors/mjones HTTP/1.1
[various other headers]
openSlotRequest date = 2010-01-04/ HTTP/1.1 200 OK
[various headers]
openSlotList
slot id = 1234 doctor = mjones start = 1400 end = 1450/
slot id = 5678 doctor = mjones start = 1600 end = 1650/
/openSlotList
POST /slots/1234 HTTP/1.1
[various other headers]
appointmentRequest
patient id = jsmith/
/appointmentRequest
HTTP/1.1 200 OK
[various headers]
appointment
slot id = 1234 doctor = mjones start = 1400 end = 1450/
patient id = jsmith/
/appointment
108. Niveau 2 - utilisation des Ressources et des Verbes
• Requêtes à différentes ressources en utilisant les verbes HTTP. Les codes de retour
HTTP sont utilisés pour indiquer le succès des requêtes.
109. Niveau 2 - utilisation des Ressources et des Verbes
GET /doctors/mjones/slots?date=20100104status=open HTTP/1.1
Host: royalhope.nhs.uk
HTTP/1.1 200 OK
[various headers]
openSlotList
slot id = 1234 doctor = mjones start = 1400 end = 1450/
slot id = 5678 doctor = mjones start = 1600 end = 1650/
/openSlotList
POST /slots/1234 HTTP/1.1
[various other headers]
appointmentRequest
patient id = jsmith/
/appointmentRequest
HTTP/1.1 201 Created
Location: slots/1234/appointment
[various headers]
appointment
slot id = 1234 doctor = mjones start = 1400 end = 1450/
patient id = jsmith/
/appointment
HTTP/1.1 409 Conflict
[various headers]
openSlotList
slot id = 5678 doctor = mjones start = 1600 end = 1650/
/openSlotList
110. Niveau 3 - Ressource/Verbes et HATEOAS
• Chaque ressource décrit les références et les liens avec d’autres ressources
111. Niveau 3 - Ressource/Verbes et HATEOAS
GET /doctors/mjones/slots?date=20100104status=open HTTP/1.1
Host: royalhope.nhs.uk
HTTP/1.1 200 OK
[various headers]
openSlotList
slot id = 1234 doctor = mjones start = 1400 end = 1450
link rel = /linkrels/slot/book
uri = /slots/1234/
/slot
/openSlotListPOST /slots/1234 HTTP/1.1
[various other headers]
appointmentRequest
patient id = jsmith/
/appointmentRequest
HTTP/1.1 201 Created
Location: http://royalhope.nhs.uk/slots/1234/appointment
[various headers]
appointment
slot id = 1234 doctor = mjones start = 1400 end = 1450/
patient id = jsmith/
link rel = /linkrels/appointment/cancel
uri = /slots/1234/appointment/
link rel = /linkrels/appointment/addTest
uri = /slots/1234/appointment/tests/
link rel = self
uri = /slots/1234/appointment/
link rel = /linkrels/appointment/changeTime
uri = /doctors/mjones/slots?date=20100104@status=open/
link rel = /linkrels/appointment/updateContactInfo
uri = /patients/jsmith/contactInfo/
link rel = /linkrels/help
uri = /help/appointment/
/appointment
ATOM
(RFC 4287)
Donne moi l’URI de linkrels/slot/book
112. Pour résumer
• Le niveau 3 est un pré-requis pour construire une API WEB type REST
• Niveau 0 ne doit pas être utilisé
• Niveau 1 permet d’identifier les différentes ressource de votre service
• Niveau 2 encourage l’utilisation des verbes HTTP plutôt que de redéfinir des méthode
• Niveau 3 introduit les notions de découverte et de relation entre les ressources. Le
service devient auto-documenté