Échange de données 1

Échange de données 1


Laboratoire 1

2.1 - Service web

2.2 - Client HTTP

Depuis très longtemps, la connectivité réseau est utilisé pour permettre à un programme d'exécuter une tâche sur une autre machine.

  • Plusieurs standards/protocoles sont utilisés
  • Demandent souvent de contrôler les 2 côtés de la communication
  • Imposent des technologies

HTTP

Youtube: HTTP 1 Vs HTTP 2 Vs HTTP 3!

API HTTP

En exposant l'interface logicielle, API, via le protocole HTTP, toutes sortes de clients peuvent en bénéficier.

  • Standard établi
  • Interopérabilité
  • Flexibilité

Paradigmes HTTP

Au fil du temps, plusieurs mécanismes ont été développé pour rendre plus efficace l'utilisation de HTTP dans différents contexte

  • RPC : Actions
  • REST : Ressources
  • gRPC
  • GraphQL
  • WebHooks
  • Server-Sent Events
  • WebSockets

Protocole HTTP

Requête
Réponse

Requête GET vs POST

GET

  • Récupérer des données
  • Paramètres via l'URL, query params /products?query=keyboard&sort=asc

POST

  • Envoyer des données
  • Paramètres via l'URL disponible ET via le body
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain
    • application/octet-stream

Exemples POST

Status

  • 1XX Information
  • 2XX Succès
  • 3XX Redirection
  • 4XX Erreur du client
  • 5XX Erreur du serveur
Status Codes

Références HTTP

Démo brute

HTTP est un protocole au format texte, il est possible de le tester avec un client TCP. Le service Echo permet de tester plusieurs types de requêtes-réponses HTTP.

bash
Simple
copier
echo -ne \
'GET /ed-1/02_1-service-web/echo_http_server.sinatra HTTP/1.1\r\n'\
'Host: cegep.jhoffman.ca\r\n'\
'Connection: close\r\n'\
'\r\n'\
| openssl s_client -connect cegep.jhoffman.ca:443 -quiet 2>/dev/null
HTTP/1.1 200 OK
Date: Mon, 03 Aug 2026 15:04:34 GMT
Server: Apache/2.4.68 (Debian)
cache-control: max-age=0, private, must-revalidate
x-request-id: 5679ac38-dc65-4096-b144-fc4043291598
x-runtime: 0.002240
x-content-type-options: nosniff
X-Powered-By: Phusion Passenger(R) 6.0.22
etag: W/"a78c007efd008fd2747bb9b705fb8ec2"
Content-Length: 133
Status: 200 OK
Connection: close
Content-Type: application/json

{"method":"get","host":"cegep.jhoffman.ca","path":null,"query_params":[],"headers":{"host":"cegep.jhoffman.ca","version":"HTTP/1.1"}}

bash
Chemin et Paramètres
copier
echo -ne \
'GET /ed-1/02_1-service-web/echo_http_server.sinatra/a/b/c?search=lotr&sort=year HTTP/1.1\r\n'\
'Host: cegep.jhoffman.ca\r\n'\
'Connection: close\r\n'\
'\r\n'\
| openssl s_client -connect cegep.jhoffman.ca:443 -quiet 2>/dev/null
HTTP/1.1 200 OK
...

{
"method": "get",
"host": "cegep.jhoffman.ca",
"path": null,
"query_params": [
[
"search",
"lotr"
],
[
"sort",
"year"
]
],
"headers": {
"host": "cegep.jhoffman.ca",
"version": "HTTP/1.1"
}
}

bash
POST, En-tête et Corps
copier
echo -ne \
'POST /ed-1/02_1-service-web/echo_http_server.sinatra/send-body HTTP/1.1\r\n'\
'Host: cegep.jhoffman.ca\r\n'\
'Connection: close\r\n'\
'User-Agent: telnet/demo\r\n'\
'Content-Type: text/plain\r\n'\
'Content-Length: 13\r\n'\
'\r\n'\
'allo le monde\r\n'\
'\r\n'\
| openssl s_client -connect cegep.jhoffman.ca:443 -quiet 2>/dev/null
HTTP/1.1 200 OK
Content-Length: 184
...

{
"method": "post",
"host": "cegep.jhoffman.ca",
"path": null,
"query_params": [],
"headers": {
"user-agent": "telnet/demo",
"host": "cegep.jhoffman.ca",
"version": "HTTP/1.1"
},
"body": "allo le monde"
}

Pour élaborer des requêtes plus complexes, il existe des clients HTTP spécialisés

Ce type d'outil est très utile pour expérimenter et déboguer les requêtes-réponses lors du développement d'un service web.

Pour répondre aux besoins du cours, nous utiliserons l'outil personnalisé Peek

Contrats API

Pour nous permettre d'exprimer efficacement le format attendu pour les requêtes-réponses d'un service web, nous utiliserons la syntaxe suivante

http
VERBE PATH HTTP/1.1
Header1: Value1
Header2: Value2

Body...

=== Réponse

...


~~~ Réponse alternative

...
http
Exemple de contrat pour Dad Joke
GET /
Accept: text/plain

===

...La blague...

Go!