HTTP Le protocole que chaque développeur Web doit connaître - Partie 1

HTTP est synonyme de protocole de transfert hypertexte. Il s'agit d'un protocole de couche d'application sans état pour la communication entre systèmes distribués et constitue le fondement du Web moderne. En tant que développeur Web, nous devons tous bien comprendre ce protocole..

Passons en revue ce protocole puissant du point de vue d'un développeur Web. Nous aborderons le sujet en deux parties. Dans cette première entrée, nous allons couvrir les bases et décrire les différents en-têtes de requête et de réponse. Dans l'article qui suit, nous passerons en revue des éléments spécifiques de HTTP, à savoir la mise en cache, le traitement de la connexion et l'authentification..

Bien que je mentionnerai quelques détails liés aux en-têtes, il est préférable de consulter plutôt le RFC (RFC 2616) pour une couverture détaillée. Je signalerai des parties spécifiques du RFC tout au long de l'article.

À la recherche d'une solution rapide?

Si vous rencontrez des problèmes avec une erreur HTTP dans WordPress que vous souhaitez réparer, vous pouvez commander un correctif d'erreur Express Express sur Envato Studio..


Notions de base sur HTTP

HTTP permet la communication entre une variété d'hôtes et de clients et prend en charge un mélange de configurations réseau.

Pour rendre cela possible, il suppose très peu de choses sur un système particulier et ne conserve pas d’état entre différents échanges de messages..

Cela rend HTTP un apatride protocole. La communication s'effectue généralement via TCP / IP, mais tout transport fiable peut être utilisé. Le port par défaut pour TCP / IP est 80, mais d'autres ports peuvent aussi être utilisés.

Des en-têtes personnalisés peuvent également être créés et envoyés par le client..

La communication entre un hôte et un client se produit, via un paire requête / réponse. Le client initie un message de requête HTTP, qui est traité via un message de réponse HTTP en retour. Nous examinerons cette paire de messages fondamentale dans la section suivante.

La version actuelle du protocole est HTTP / 1.1, ce qui ajoute quelques fonctionnalités supplémentaires à la version 1.0 précédente. Le plus important d'entre eux, à mon avis, comprend connexions persistantes, codage de transfert en bloc et en-têtes de mise en cache à grain fin. Nous aborderons brièvement ces fonctionnalités dans cet article. une couverture approfondie sera fournie dans la deuxième partie.

URL

Le message de requête est au cœur des communications Web et est envoyé via des URL (Uniform Resource Locator). Je suis sûr que vous connaissez déjà les URL, mais par souci d'exhaustivité, je vais l'inclure ici. Les URL ont une structure simple composée des composants suivants:

Le protocole est typiquement http, mais ça peut aussi être https pour des communications sécurisées. Le port par défaut est 80, mais on peut en définir explicitement, comme illustré dans l'image ci-dessus. Le chemin de la ressource est le chemin local à la ressource sur le serveur.

Verbes

Il existe également des serveurs proxy de débogage Web, tels que Violoneux sur Windows et Charles Proxy pour OSX.

Les URL révèlent l'identité de l'hôte avec lequel nous souhaitons communiquer, mais l'action à exécuter sur l'hôte est spécifiée via les verbes HTTP. Bien sûr, un client souhaite que l'hôte exécute plusieurs actions. HTTP a formalisé sur quelques-uns qui capturent l'essentiel qui est universellement applicable pour tous les types d'applications.

Ces verbes de demande sont:

  • OBTENIR: aller chercher une ressource existante. L'URL contient toutes les informations nécessaires au serveur pour localiser et renvoyer la ressource..
  • POSTER: créer une nouvelle ressource. Les requêtes POST portent généralement une charge utile spécifiant les données de la nouvelle ressource..
  • METTRE: mettre à jour une ressource existante. La charge utile peut contenir les données mises à jour pour la ressource.
  • EFFACER: effacer une ressource existante.

Les quatre verbes ci-dessus sont les plus populaires, et la plupart des outils et des frameworks exposent explicitement ces verbes de demande.. METTRE et EFFACER sont parfois considérées comme des versions spécialisées du POSTER verbe, et ils peuvent être conditionnés comme POSTER requêtes avec la charge utile contenant l'action exacte: créer, mettre à jour ou effacer.

Il existe certains verbes moins utilisés que HTTP prend également en charge:

  • TÊTE: cela ressemble à GET, mais sans le corps du message. Il est utilisé pour récupérer les en-têtes de serveur pour une ressource particulière, généralement pour vérifier si la ressource a changé, via des horodatages..
  • TRACE: utilisé pour récupérer les sauts qu'une requête prend pour aller-retour depuis le serveur. Chaque proxy ou passerelle intermédiaire injecterait son nom IP ou DNS dans le répertoire Via champ d'en-tête. Cela peut être utilisé à des fins de diagnostic.
  • OPTIONS: utilisé pour récupérer les capacités du serveur. Côté client, il peut être utilisé pour modifier la requête en fonction de ce que le serveur peut prendre en charge..

Codes de statut

Avec les URL et les verbes, le client peut initier des requêtes sur le serveur. En retour, le serveur répond avec des codes d'état et des données utiles. Le code d'état est important et indique au client comment interpréter la réponse du serveur. La spécification HTTP définit certaines plages de numéros pour des types de réponses spécifiques:

1xx: Messages d'information

Tous les clients HTTP / 1.1 doivent accepter les Transfert-Encodage entête.

Cette classe de codes a été introduite dans HTTP / 1.1 et est purement provisoire. Le serveur peut envoyer un Attendre: 100-continue message, indiquant au client de continuer à envoyer le reste de la demande ou d'ignorer s'il l'a déjà envoyée. Les clients HTTP / 1.0 sont supposés ignorer cet en-tête.

2xx: réussi

Cela indique au client que la demande a été traitée avec succès. Le code le plus courant est 200 OK. Pour un OBTENIR demande, le serveur envoie la ressource dans le corps du message. Il existe d'autres codes moins fréquemment utilisés:

  • 202 Accepté: la demande a été acceptée mais ne peut pas inclure la ressource dans la réponse. Ceci est utile pour le traitement asynchrone côté serveur. Le serveur peut choisir d'envoyer des informations pour la surveillance.
  • 204 Pas de contenu: il n'y a pas de corps de message dans la réponse.
  • 205 Réinitialiser le contenu: indique au client de réinitialiser l'affichage du document.
  • 206 Contenu partiel: indique que la réponse ne contient qu'un contenu partiel. Des en-têtes supplémentaires indiquent la plage exacte et les informations d'expiration de contenu.

3xx: redirection

404 indique que la ressource n'est pas valide et n'existe pas sur le serveur.

Cela nécessite que le client prenne des mesures supplémentaires. Le cas d'utilisation le plus courant consiste à accéder à une URL différente afin d'extraire la ressource..

  • 301 Déplacé de façon permanente: la ressource est maintenant située dans une nouvelle URL.
  • 303 Voir Autre: la ressource est temporairement située sur une nouvelle URL. le Emplacement l'en-tête de réponse contient l'URL temporaire.
  • 304 Non modifié: le serveur a déterminé que la ressource n'a pas changé et le client doit utiliser sa copie en cache. Cela repose sur le fait que le client envoie ETag (Balise Enttity) des informations qui constituent un hachage du contenu. Le serveur compare cela avec son propre calcul ETag pour vérifier les modifications.

4xx: erreur client

Ces codes sont utilisés lorsque le serveur pense que le client est en cause, soit en demandant une ressource non valide, soit en effectuant une mauvaise requête. Le code le plus populaire dans cette classe est 404 introuvable, Je pense que tout le monde va s'identifier. 404 indique que la ressource n'est pas valide et n'existe pas sur le serveur. Les autres codes de cette classe comprennent:

  • 400 Bad Request: la requête a été mal formée.
  • 401 Non autorisé: la requête nécessite une authentification. Le client peut répéter la demande avec le Autorisation entête. Si le client a déjà inclus le Autorisation en-tête, alors les informations d'identification étaient fausses.
  • 403 Interdit: le serveur a refusé l'accès à la ressource..
  • 405 Méthode non autorisée: verbe HTTP non valide utilisé dans la ligne de demande ou le serveur ne prend pas en charge ce verbe.
  • 409 Conflit: le serveur n'a pas pu terminer la demande car le client tente de modifier une ressource plus récente que l'horodatage du client. Les conflits surviennent principalement pour les demandes PUT lors de modifications collaboratives sur une ressource.

5xx: Erreur du serveur

Cette classe de codes est utilisée pour indiquer une défaillance du serveur lors du traitement de la demande. Le code d'erreur le plus couramment utilisé est 500 Erreur interne du serveur. Les autres dans cette classe sont:

  • 501 non implémenté: le serveur ne supporte pas encore la fonctionnalité demandée.
  • 503 Service Indisponible: cela peut se produire si un système interne du serveur est en panne ou si le serveur est surchargé. En règle générale, le serveur ne répond même pas et la requête expire.

Formats de message de demande et de réponse

Jusqu'à présent, nous avons vu que URL, verbes et codes d'état constituent les éléments fondamentaux d'une paire requête / réponse HTTP.

Regardons maintenant le contenu de ces messages. La spécification HTTP indique qu'un message de demande ou de réponse a la structure générique suivante:

message =  * () CRLF []  = Ligne de demande | Status-Line  = Nom du champ ':' Valeur du champ

Il est obligatoire de placer une nouvelle ligne entre les en-têtes et le corps du message. Le message peut contenir un ou plusieurs en-têtes, qui sont en gros classés comme suit:

  • en-têtes généraux: applicables aux messages de requête et de réponse.
  • demander des en-têtes spécifiques.
  • en-têtes spécifiques à la réponse.
  • en-têtes d'entités.

Le corps du message peut contenir les données complètes de l’entité ou peut être fragmenté si le codage en bloc (Transfer-Encoding: chunked) est utilisé. Tous les clients HTTP / 1.1 doivent accepter les Transfert-Encodage entête.

En-têtes généraux

Il existe quelques en-têtes (en-têtes généraux) qui sont partagés par les messages de requête et de réponse:

general-header = Cache-Control | Connexion | Date | Pragma | Bande-annonce | Transfert-Encodage | Mise à niveau | Via | Attention

Nous avons déjà vu certains de ces en-têtes, en particulier Via et Transfert-Encodage. Nous couvrirons Cache-Control et Lien dans la deuxième partie.

Le code d'état est important et indique au client comment interpréter la réponse du serveur..

  • Via l'en-tête est utilisé dans un message TRACE et mis à jour par tous les serveurs proxy et passerelles intermittents
  • Pragma est considéré comme un en-tête personnalisé et peut être utilisé pour inclure des en-têtes spécifiques à une implémentation. La directive pragma la plus couramment utilisée est Pragma: no-cache, qui est vraiment Cache-Control: pas de cache sous HTTP / 1.1. Ce sera couvert dans la partie 2 de l'article.
  • le Rendez-vous amoureux Le champ d'en-tête est utilisé pour horodatage du message de demande / réponse
  • Améliorer est utilisé pour changer de protocole et permettre une transition en douceur vers un nouveau protocole.
  • Transfert-Encodage est généralement utilisé pour casser la réponse en parties plus petites avec le Transfer-Encoding: chunked valeur. Ceci est un nouvel en-tête dans HTTP / 1.1 et permet la transmission en continu de la réponse au client au lieu d'une grosse charge utile.

En-têtes d'entité

Les messages de demande et de réponse peuvent également inclure des en-têtes d’entité pour fournir des méta-informations sur le contenu (corps du message ou entité). Ces en-têtes incluent:

entity-header = Autoriser | Contenu-Encodage | Contenu-Langue | Longueur du contenu | Contenu-Lieu | Content-MD5 | Contenu-Range | Type de contenu | Expire | Dernière modification

La totalité de la Contenu- les en-têtes préfixés fournissent des informations sur la structure, le codage et la taille du corps du message. Certains de ces en-têtes doivent être présents si l'entité fait partie du message..

le Expire en-tête indique un horodatage de l'expiration de l'entité. Fait intéressant, un "n'expire jamais" l'entité est envoyée avec un horodatage d'un an dans le futur. le Dernière modification en-tête indique le dernier horodatage de modification pour l'entité.

Des en-têtes personnalisés peuvent également être créés et envoyés par le client. ils seront traités comme des en-têtes d'entité par le protocole HTTP.

Il s’agit en réalité d’un mécanisme d’extension, et certaines implémentations client-serveur peuvent choisir de communiquer spécifiquement sur ces en-têtes d’extension. Bien que HTTP prenne en charge les en-têtes personnalisés, il recherche en réalité les en-têtes de requête et de réponse, que nous couvrirons ensuite..

Format de demande

Le message de demande a la même structure générique que ci-dessus, à l'exception de la ligne de demande qui ressemble à:

Ligne de demande = Méthode URI du SP SP-Version HTTP CRLF Method = "OPTIONS" | "HEAD" | "GET" | "POST" | "PUT" | "SUPPRIMER" | "TRACE"

SP est le séparateur d'espaces entre les jetons. Version HTTP est spécifié comme "HTTP / 1.1" puis suivi d'une nouvelle ligne. Ainsi, un message de requête typique pourrait ressembler à:

GET / articles / http-basics HTTP / 1.1 Hôte: www.articles.com Connexion: keep-alive Cache-Control: pas de cache Pragma: pas de cache Accept: text / html, application / xhtml + xml, application / xml; q = 0,9, * / *; q = 0,8

Notez la ligne de demande suivie de plusieurs en-têtes de demande. le Hôte l'en-tête est obligatoire pour les clients HTTP / 1.1. OBTENIR les demandes n'ont pas de corps de message, mais POSTER les demandes peuvent contenir les données de poste dans le corps.

Les en-têtes de requête agissent en tant que modificateurs du message de requête. La liste complète des en-têtes de requête connus n'est pas trop longue et est fournie ci-dessous. Les en-têtes inconnus sont traités comme des champs d'en-tête d'entité.

request-header = Accepter | Accepter-Charset | Accepter-Encodage | Accepter la langue | Autorisation | Attendre | À partir de | Hôte | Si-match | If-Modified-Since | Si-aucun-match | Si-gamme | Si-non modifié-depuis | Max-Forwards | Autorisation de proxy | Gamme | Référant | TE | Agent utilisateur

le Acceptez les en-têtes préfixés indiquent les types de support, les langues et les jeux de caractères acceptables sur le client. De, Hôte, Référant et Agent utilisateur identifier les détails sur le client qui a initié la demande. le Si- les en-têtes préfixés sont utilisés pour rendre une demande plus conditionnelle, et le serveur renvoie la ressource uniquement si la condition est remplie. Sinon, il retourne un 304 non modifié. La condition peut être basée sur un horodatage ou un ETag (un hachage de l'entité).

Format de réponse

Le format de réponse est similaire au message de demande, à l'exception de la ligne d'état et des en-têtes. La ligne d'état a la structure suivante:

Status-Line = Version HTTP SP-Status Code-CR de phrase de motif CRLF
  • HTTP-Version est envoyé en tant que HTTP / 1.1
  • Le code de statut est l'un des nombreux statuts décrits précédemment.
  • La phrase de raison est une version du code d'état lisible par l'homme..

Une ligne d'état typique pour une réponse réussie pourrait ressembler à ceci:

HTTP / 1.1 200 OK

Les en-têtes de réponse sont également assez limités et l'ensemble complet est donné ci-dessous:

 response-header = Accept-Ranges | Âge | ETag | Lieu | Authentification par procuration | Réessayer après | Serveur | Vary | WWW-Authentifier
  • Âge est le temps en secondes depuis que le message a été généré sur le serveur.
  • ETag est le hachage MD5 de l'entité et utilisé pour vérifier les modifications.
  • Emplacement est utilisé lors de l'envoi d'une redirection et contient la nouvelle URL.
  • Serveur identifie le serveur générant le message.

Cela a fait l'objet de beaucoup de théories, donc je ne vous blâmerai pas pour les yeux assoupis. Dans les sections suivantes, nous aurons plus de pratique et nous passerons en revue les outils, les cadres et les bibliothèques..


Outils pour afficher le trafic HTTP

Un certain nombre d'outils sont disponibles pour surveiller les communications HTTP. Ici, nous énumérons certains des outils les plus populaires.

Sans aucun doute, le Inspecteur Chrome / Webkit est un favori parmi les développeurs web:

Il existe également des serveurs proxy de débogage Web, tels que Violoneux sur Windows et Charles Proxy pour OSX. Mon collègue, Rey Bango, a écrit un excellent article sur ce sujet..

Pour la ligne de commande, nous avons des utilitaires comme curl, tcpdump et tshark pour surveiller le trafic HTTP.


Utilisation de HTTP dans les cadres et les bibliothèques Web

Maintenant que nous avons examiné les messages de demande / réponse, il est temps que nous apprenions comment les bibliothèques et les frameworks l'exposent sous la forme d'une API. Nous allons utiliser ExpressJS pour le noeud, Rubis sur rails, et jQuery Ajax comme nos exemples.

ExpressJS

Si vous construisez des serveurs Web dans NodeJS, il y a de fortes chances que vous ayez considéré ExpressJS. ExpressJS a été inspiré à l’origine par un framework Ruby Web, appelé Sinatra. Comme prévu, l’API est également influencée.

Comme nous traitons avec une infrastructure côté serveur, il existe deux tâches principales dans le traitement des messages HTTP:

  • Lire des fragments d'URL et demander des en-têtes.
  • Écrire les en-têtes et le corps de la réponse

Comprendre HTTP est crucial pour avoir une interface propre, simple et RESTful entre deux points finaux.

ExpressJS fournit une API simple pour faire exactement cela. Nous ne couvrirons pas les détails de l'API. Au lieu de cela, nous fournirons des liens vers la documentation détaillée sur les guides ExpressJS. Les méthodes de l'API s'expliquent d'elles-mêmes dans la plupart des cas. Un exemple de l'API liée à la demande est présenté ci-dessous:

  • req.body: récupère le corps de la requête.
  • req.query: récupère le fragment de requête de l'URL.
  • req.originalUrl
  • req.host: lit le Hôte champ d'en-tête.
  • req.accepts: lit les types MIME acceptables côté client.
  • req.get OU req.header: lit tout champ d'en-tête passé en argument.

Sur le chemin du client, ExpressJS fournit l'API de réponse suivante:

  • res.status: définit un code d'état explicite.
  • res.set: définit un en-tête de réponse spécifique.
  • res.send: envoi HTML, JSON ou un flux d'octets.
  • res.sendFile: transférer un fichier sur le client.
  • res.render: restitue un modèle de vue express.
  • res.redirect: redirige vers un autre itinéraire. Express ajoute automatiquement le code de redirection par défaut de 302.

Rubis sur rails

Les messages de requête et de réponse sont essentiellement les mêmes, à l'exception de la première ligne et des en-têtes de message.

Dans Rails, les modules ActionController et ActionDispatch fournissent l’API permettant de gérer les messages de demande et de réponse..

ActionController fournit une API de haut niveau pour lire l'URL de la demande, afficher la sortie et rediriger vers un autre noeud final. Un point final (ou route) est traité comme une méthode d'action. La plupart des informations de contexte nécessaires dans une méthode d'action sont fournies via le demande, réponse et params objets.

  • params: donne accès aux paramètres d'URL et aux données POST.
  • request: contient des informations sur le client, les en-têtes et l'URL.
  • response: utilisé pour définir les en-têtes et les codes d'état.
  • render: rendre des vues en développant des modèles.
  • redirect_to: redirige vers une méthode d'action ou une URL différente.

ActionDispatch fournit un accès plus fin aux messages de demande / réponse, via la commande ActionDispatch :: Request et ActionDispatch :: Response Des classes. Il expose un ensemble de méthodes de requête pour vérifier le type de demande (obtenir?(), poster?(), tête?(), local?()). Les en-têtes de demande sont directement accessibles via le request.headers () méthode.

Du côté de la réponse, il fournit des méthodes pour définir biscuits(), emplacement = () et statut = (). Si vous vous sentez aventureux, vous pouvez également définir la corps = () et contourner le système de rendu Rails.

jQuery Ajax

JQuery étant avant tout une bibliothèque côté client, son API Ajax fournit l’opposé d’un framework côté serveur. En d'autres termes, cela vous permet de lis messages de réponse et modifier demander des messages. jQuery expose une API simple via jQuery.ajax (paramètres):

En passant un réglages objet avec le avantEnvoyer callback, nous pouvons modifier les en-têtes de requête. Le rappel reçoit l’objet jqXHR (jQuery XMLHttpRequest) qui expose une méthode, appelée setRequestHeader () définir les en-têtes.

$ .ajax (url: 'http://www.articles.com/latest', tapez: 'GET', beforeSend: function (jqXHR) jqXHR.setRequestHeader ('Accepts-Language', 'en-US, en '););
  • L’objet jqXHR peut également être utilisé pour lire les en-têtes de réponse avec le jqXHR.getResponseHeader ().
  • Si vous souhaitez effectuer des actions spécifiques pour différents codes d’état, vous pouvez utiliser statusCode rappeler:
$ .ajax (statusCode: 404: function () alert ("page introuvable"););

Résumé

Voilà qui résume notre tour rapide du protocole HTTP.

Nous avons examiné la structure des URL, les verbes et les codes de statut: les trois piliers de la communication HTTP.

Les messages de demande et de réponse sont généralement les mêmes, à l'exception de la première ligne et des en-têtes de message. Enfin, nous avons examiné comment modifier les en-têtes de demande et de réponse dans les frameworks Web et les bibliothèques..

Comprendre HTTP est crucial pour avoir une interface propre, simple et RESTful entre deux points de terminaison. À plus grande échelle, cela aide également lors de la conception de votre infrastructure réseau et offre une expérience inoubliable à vos utilisateurs finaux.

Dans la deuxième partie, nous examinerons la gestion des connexions, l’authentification et la mise en cache! À plus tard.


Références

  • Spécification HTTP
  • Guide définitif HTTP