HTTP protokollen hver webutvikler må vite - del 1

HTTP står for Hypertext Transfer Protocol. Det er en statsløs, applikasjonslagprotokoll for kommunikasjon mellom distribuerte systemer, og er grunnlaget for den moderne web. Som webutvikler må vi alle ha en sterk forståelse av denne protokollen.

La oss se gjennom denne kraftige protokollen gjennom linsen til en webutvikler. Vi tar tak i emnet i to deler. I denne første oppføringen vil vi dekke grunnleggende og skissere de ulike forespørslene og svarhodene. I oppfølgingsartikkelen vurderer vi bestemte deler av HTTP - nemlig caching, tilkoblingshåndtering og autentisering.

Selv om jeg skal nevne noen detaljer relatert til overskrifter, er det best å i stedet konsultere RFC (RFC 2616) for grundig dekning. Jeg vil peke på bestemte deler av RFC gjennom hele artikkelen.

Leter du etter en rask løsning?

Hvis du har problemer med en HTTP-feil i WordPress som du trenger fast, kan du bestille en Express HTTP-feilrettelse på Envato Studio, og få feilen løst på en dag for bare $ 50.


HTTP-grunnleggende

HTTP tillater kommunikasjon mellom en rekke verter og klienter, og støtter en blanding av nettverkskonfigurasjoner.

For å gjøre dette mulig, antar det lite om et bestemt system, og holder ikke tilstand mellom forskjellige meldingsutvekslinger.

Dette gjør HTTP a statsløs protokoll. Kommunikasjonen foregår vanligvis over TCP / IP, men noen pålitelig transport kan brukes. Standardporten for TCP / IP er 80, men andre porter kan også brukes.

Tilpassede overskrifter kan også opprettes og sendes av klienten.

Kommunikasjon mellom en vert og en klient skjer via en forespørsel / svarspar. Klienten initierer en HTTP-forespørselsmelding, som blir betjent gjennom en HTTP-svarmelding i retur. Vi vil se på dette grunnleggende meldingsparet i neste avsnitt.

Den nåværende versjonen av protokollen er HTTP / 1.1, som legger til noen ekstra funksjoner til den forrige 1.0-versjonen. Den viktigste av disse, etter min mening, inkluderer vedvarende forbindelser, chunked overføringskoding og finkornede caching-hoder. Vi vil kort berøre disse funksjonene i denne artikkelen; Dyp dekning vil bli gitt i del to.

webadresser

I hjertet av webkommunikasjon er forespørselsmeldingen, som sendes via Uniform Resource Locators (URLs). Jeg er sikker på at du allerede er kjent med nettadresser, men for fullstendighet skyld, vil jeg inkludere det her. Nettadresser har en enkel struktur som består av følgende komponenter:

Protokollen er typisk http, men det kan også være https for sikker kommunikasjon. Standardporten er 80, men man kan angi eksplisitt, som illustrert i bildet ovenfor. Resursveien er lokal sti til ressursen på serveren.

verb

Det er også web feilsøking proxies, som Fiddler på Windows og Charles Proxy for OSX.

Nettadresser avslører identiteten til den aktuelle verten som vi vil kommunisere med, men handlingen som skal utføres på verten, er spesifisert via HTTP-verb. Selvfølgelig er det flere handlinger som en klient vil at verten skal utføre. HTTP har formalisert noen få som fanger de essensielle som er universelt gjeldende for alle typer applikasjoner.

Disse forespørgsordene er:

  • : hente en eksisterende ressurs. Nettadressen inneholder all nødvendig informasjon som serveren trenger for å finne og returnere ressursen.
  • POST: skape en ny ressurs. POST-forespørsler bærer vanligvis en nyttelast som spesifiserer dataene for den nye ressursen.
  • SETTE: Oppdater en eksisterende ressurs. Lasten kan inneholde oppdaterte data for ressursen.
  • SLETT: slette en eksisterende ressurs.

De ovennevnte fire verbene er de mest populære, og de fleste verktøy og rammebetingelser ekspliserer eksplisitt disse forespørselsverker. SETTE og SLETT Noen ganger betraktes spesialiserte versjoner av POST verb, og de kan være pakket som POST forespørsler med nyttelast som inneholder den nøyaktige handlingen: skape, Oppdater eller slette.

Det er noen mindre brukte verb som HTTP også støtter:

  • HODE: Dette ligner på GET, men uten meldingslegemet. Det er vant til å hente serveroverskriftene for en bestemt ressurs, generelt for å sjekke om ressursen har endret seg, via tidsstempler.
  • TRACE: brukes til å hente humleen som en forespørsel tar til rundtur fra serveren. Hver mellomliggende proxy eller gateway ville injisere sitt IP- eller DNS-navn i via toppfelt. Dette kan brukes til diagnostiske formål.
  • ALTERNATIVER: brukes til å hente serveregenskapene. På klientsiden kan den brukes til å endre forespørselen basert på hva serveren kan støtte.

Statuskoder

Med nettadresser og verb kan klienten starte forespørsler til serveren. Til gengitt reagerer serveren med statuskoder og meldings nyttelaster. Statuskoden er viktig og forteller kunden hvordan man tolker serverresponsen. HTTP-spesifikasjonen definerer bestemte nummerintervaller for bestemte typer svar:

1xx: Informasjonsmeldinger

Alle HTTP / 1.1 klienter er pålagt å akseptere Transfer-Encoding Overskrift.

Denne klassen av koder ble introdusert i HTTP / 1.1 og er rent foreløpig. Serveren kan sende en Forvent: 100-fortsett melding, og forteller klienten å fortsette å sende resten av forespørselen, eller ignorere om den allerede har sendt den. HTTP / 1.0-klienter er ment å ignorere denne overskriften.

2xx: Vellykket

Dette forteller klienten at forespørselen ble behandlet. Den vanligste koden er 200 OK. For en forespørsel, sender serveren ressursen i meldingslegemet. Det finnes andre mindre brukte koder:

  • 202 Godkjent: forespørselen ble akseptert, men kan ikke inneholde ressursen i svaret. Dette er nyttig for asynkbehandling på serversiden. Serveren kan velge å sende informasjon for overvåking.
  • 204 Ingen innhold: Det er ingen meldingslegem i svaret.
  • 205 Tilbakestill innhold: Indikerer til klienten for å tilbakestille sin dokumentvisning.
  • 206 Delvis innhold: indikerer at svaret bare inneholder delvis innhold. Ytterligere overskrifter angir nøyaktig rekkevidde og innholdsutløpsinformasjon.

3xx: Omdirigering

404 indikerer at ressursen er ugyldig og ikke eksisterer på serveren.

Dette krever at klienten tar ytterligere tiltak. Det vanligste brukssaken er å hoppe til en annen nettadresse for å hente ressursen.

  • 301 Flyttet permanent: ressursen er nå plassert på en ny nettadresse.
  • 303 Se Annet: ressursen er midlertidig plassert på en ny nettadresse. De plassering svarhodet inneholder den midlertidige nettadressen.
  • 304 Ikke endret: serveren har bestemt at ressursen ikke har endret seg, og klienten bør bruke sin bufret kopi. Dette er avhengig av det faktum at klienten sender ETag (Enttity Tag) informasjon som er en hash av innholdet. Serveren sammenligner dette med sin egen beregne ETag for å sjekke om endringer.

4xx: Klientfeil

Disse kodene brukes når serveren mener at klienten er feil, enten ved å be om en ugyldig ressurs eller å lage en dårlig forespørsel. Den mest populære koden i denne klassen er 404 ikke funnet, som jeg tror alle vil identifisere med. 404 indikerer at ressursen er ugyldig og ikke eksisterer på serveren. De andre kodene i denne klassen inkluderer:

  • 400 Dårlig forespørsel: forespørselen ble misdannet.
  • 401 Uautorisert: forespørsel krever godkjenning. Klienten kan gjenta forespørselen med Autorisasjon Overskrift. Hvis klienten allerede inkluderte Autorisasjon header, så var legitimasjonene feil.
  • 403 Forbudt: serveren har nektet tilgang til ressursen.
  • 405 Metode ikke tillatt: ugyldig HTTP-verb som brukes i forespørselslinjen, eller serveren støtter ikke dette verbet.
  • 409 Konflikt: Serveren kunne ikke fullføre forespørselen fordi klienten prøver å endre en ressurs som er nyere enn klientens tidsstempel. Konflikter oppstår for det meste for PUT-forespørsler under samarbeidende redigeringer på en ressurs.

5xx: Serverfeil

Denne klassen av koder brukes til å indikere en serverfeil under behandling av forespørselen. Den vanligste feilkoden er 500 intern serverfeil. De andre i denne klassen er:

  • 501 ikke implementert: Serveren støtter ennå ikke den forespurte funksjonaliteten.
  • 503 tjeneste utilgjengelig: Dette kan skje hvis et internt system på serveren har feilet eller serveren er overbelastet. Serveren reagerer ikke engang, og forespørselen vil tidsavbrudd.

Meldingsformater for forespørsel og svar

Så langt har vi sett det Nettadresser, verb og statuskoder utgjør de grunnleggende delene av en HTTP-forespørsel / responspar.

La oss nå se på innholdet i disse meldingene. HTTP-spesifikasjonen angir at en forespørsel eller svarmelding har følgende generiske struktur:

melding =  * () CRLF []  = Request-Line | Status-Linje  = Feltnavn ':' Feltverdi

Det er obligatorisk å plassere en ny linje mellom meldingshoder og kropp. Meldingen kan inneholde en eller flere overskrifter, som i stor grad er klassifisert i:

  • generelle overskrifter: som gjelder for både forespørsel og svarmeldinger.
  • Be om spesifikke overskrifter.
  • svarspesifikke overskrifter.
  • enhet overskrifter.

Meldingslegemet kan inneholde de komplette enhetdataene, eller det kan være i stykker hvis den klumpete kodingen (Overførings-koding: chunked) benyttes. Alle HTTP / 1.1 klienter er pålagt å akseptere Transfer-Encoding Overskrift.

Generelle overskrifter

Det er noen overskrifter (generelle overskrifter) som deles av både forespørsel og svarmeldinger:

generell header = Cache-Control | Tilkobling | Dato | Pragma | Trailer | Transfer-Encoding | Oppgrader | Via | Advarsel

Vi har allerede sett noen av disse overskriftene, spesielt via og Transfer-Encoding. Vi vil dekke Cache-Control og Forbindelse i del to.

Statuskoden er viktig og forteller kunden hvordan man tolker serverresponsen.

  • via header brukes i en TRACE melding og oppdateres av alle intermitterende proxyer og gateways
  • Pragma anses som en egendefinert header og kan brukes til å inkludere implementeringsspesifikke overskrifter. Det mest brukte pragma-direktivet er Pragma: no-cache, som egentlig er Cache-Control: no-cache under HTTP / 1.1. Dette vil bli dekket i del 2 av artikkelen.
  • De Dato Overskriftsfelt brukes til å tidsstempelere forespørselen / svarmeldingen
  • Oppgradering brukes til å bytte protokoller og tillate en jevn overgang til en nyere protokoll.
  • Transfer-Encoding Brukes vanligvis til å bryte svaret i mindre deler med Overførings-koding: chunked verdi. Dette er en ny overskrift i HTTP / 1.1 og gir mulighet for streaming av svar til klienten i stedet for en stor nyttelast.

Enhetshoder

Forespørsels- og svarmeldinger kan også inkludere ethetsoverskrifter for å gi meta-informasjon om innholdet (f.eks. Meldingsorgan eller Enhet). Disse overskriftene inkluderer:

entity-header = Tillat | Content-Encoding | Innholdsspråk | Innholdslengde | Innhold-plassering | Innhold-MD5 | Innholdsintervall | Innholdstype | Utløper | Sist endret

Alle Innhold- Prefixed headers gir informasjon om strukturen, kodingen og størrelsen på meldingslegemet. Noen av disse overskriftene må være til stede dersom enheten er en del av meldingen.

De utløper Overskrift indikerer en tidsstempel for hvor han entitet utløper. Interessant, a "aldri utløper" Enheten sendes med en tidsstempel på ett år inn i fremtiden. De Sist endret Overskrift indikerer siste modifikasjonstidsstempel for enheten.

Tilpassede overskrifter kan også opprettes og sendes av klienten; De blir behandlet som enhetsoverskrifter av HTTP-protokollen.

Dette er virkelig en utvidelsesmekanisme, og enkelte klient-server-implementeringer kan velge å kommunisere spesielt over disse utvidelsesoverskriftene. Selv om HTTP støtter egendefinerte overskrifter, er det det som virkelig ser etter, forespørsels- og svarhodene, som vi dekker neste.

Forespørselsformat

Forespørselsmeldingen har samme generiske struktur som ovenfor, unntatt forespørselslinjen som ser ut som:

Request-Line = Metode SP URI SP HTTP-Versjon CRLF Method = "OPTIONS" | "HEAD" | "GET" | "POST" | "PUT" | "SLETT" | "TRACE"

SP er mellomromsseparatoren mellom tokens. HTTP-versjon er spesifisert som "HTTP / 1.1" og deretter etterfulgt av en ny linje. En typisk forespørselsmelding kan således se ut som:

GET / articles / http-basics HTTP / 1.1 Host: www.articles.com Connection: keep-alive Cache-Control: ikke-cache Pragma: no-cache Godta: tekst / html, application / xhtml + xml, application / xml; q = 0,9, * / *; q = 0,8

Merk forespørselen linje etterfulgt av mange forespørsel overskrifter. De Vert header er obligatorisk for HTTP / 1.1 klienter. forespørsler har ikke et meldingsorgan, men POST forespørsler kan inneholde postdata i kroppen.

Forespørselshodene fungerer som modifikatorer av forespørselsmeldingen. Den komplette listen over kjente forespørselsoverskrifter er ikke for lang, og er gitt nedenfor. Ukjente overskrifter behandles som enhetshovedfelter.

request-header = Accept | Godta-Charset | Godta-Koding | Godta-Språk | Autorisasjon | Forvent | Fra | Vert | If-Match | Hvis-Modifisert-Siden | Hvis-Ingen-Match | If-Range | Hvis-umodifisert-Siden | Max-Forward | Proxy-Authorization | Område | Referer | TE | Bruker agent

De Aksepterer Prefixed headers angir akseptable medietyper, språk og tegnsett på klienten. Fra, Vert, Referer og Bruker agent identifisere detaljer om klienten som initierte forespørselen. De Hvis- Prefixed headers brukes til å gjøre en forespørsel mer betinget, og serveren returnerer kun ressursen hvis tilstanden samsvarer. Ellers returnerer den a 304 ikke endret. Tilstanden kan være basert på en tidsstempel eller ETag (en hash av enheten).

Svarformat

Svarformatet ligner på forespørselen, unntatt statuslinjen og overskriftene. Statuslinjen har følgende struktur:

Status-Line = HTTP-versjon SP Status-kode SP Reason-Phrase CRLF
  • HTTP-versjon sendes som HTTP / 1.1
  • Status-koden er en av de mange statusene som diskuteres tidligere.
  • Reason-setningen er en menneskelig lesbar versjon av statuskoden.

En typisk statuslinje for et vellykket svar kan se slik ut:

HTTP / 1.1 200 OK

Svarhodene er også ganske begrensede, og hele settet er gitt nedenfor:

 response-header = Accept-Ranges | Alder | ETag | Beliggenhet | Proxy-Authenticate | Prøv igjen etter Server | Vary | WWW-Verifisere
  • Alder er tiden i sekunder siden meldingen ble generert på serveren.
  • ETag er MD5-hash for enheten og pleide å sjekke om endringer.
  • plassering brukes når du sender en omdirigering og inneholder den nye nettadressen.
  • Server identifiserer serveren som genererer meldingen.

Det har vært mye teori opp til dette punktet, så jeg vil ikke klandre deg for døsige øyne. I de neste avsnittene vil vi bli mer praktiske og ta en oversikt over verktøyene, rammene og bibliotekene.


Verktøy for å vise HTTP-trafikk

Det finnes en rekke verktøy tilgjengelig for å overvåke HTTP-kommunikasjon. Her viser vi noen av de mer populære verktøyene.

Utvilsomt, den Chrome / Webkit inspektør er en favoritt blant webutviklere:

Det er også web feilsøking proxies, som Fiddler på Windows og Charles Proxy for OSX. Min kollega, Rey Bango, skrev en utmerket artikkel om dette emnet.

For kommandolinjen har vi verktøy som curl, tcpdump og tshark for overvåking av HTTP-trafikk.


Bruke HTTP i webrammer og biblioteker

Nå som vi har sett på forespørsel / svarmeldinger, er det på tide at vi lærer hvordan biblioteker og rammebetingelser avslører det i form av en API. Vi skal bruke ExpressJS for Node, Ruby on Rails, og jQuery Ajax som våre eksempler.

ExpressJS

Hvis du bygger webservere i NodeJS, er det stor risiko for at du har vurdert ExpressJS. ExpressJS ble opprinnelig inspirert av et Ruby Web-rammeverk, kalt Sinatra. Som forventet er API også like påvirket.

Fordi vi arbeider med et server-side rammeverk, er det to primære oppgaver når det gjelder å håndtere HTTP-meldinger:

  • Les URL-fragmenter og forespørselhodet.
  • Skriv svarhodene og kroppen

Forstå HTTP er avgjørende for å ha et rent, enkelt og RESTful grensesnitt mellom to endepunkter.

ExpressJS gir en enkel API for å gjøre nettopp det. Vi vil ikke dekke detaljene i APIen. I stedet vil vi gi koblinger til den detaljerte dokumentasjonen om ExpressJS-guider. Metodene i API-en er selvforklarende i de fleste tilfeller. Et utvalg av forespørselsrelatert API er under:

  • req.body: få forespørsel kroppen.
  • req.query: få spørringsfragmentet til nettadressen.
  • req.originalUrl
  • req.host: leser Vert toppfelt.
  • req.accepts: leser de akseptable MIME-typene på klientsiden.
  • req.get ELLER req.header: Les et hvilket som helst overskriftsfelt som er godkjent som argument.

På vei ut til klienten gir ExpressJS følgende respons-API:

  • res.status: angi en eksplisitt statuskode.
  • res.set: angi en bestemt respons header.
  • res.send: send HTML, JSON eller en oktet-stream.
  • res.sendFile: overfør en fil til klienten.
  • res.render: gjeng en ekspressvisningsmal.
  • res.redirect: Omdirigere til en annen rute. Express legger automatisk til standard omadresseringskode på 302.

Ruby on Rails

Forespørsels- og svarmeldingene er stort sett de samme, med unntak av første linje og meldingshoder.

I Rails gir ActionController og ActionDispatch-modulene APIen for håndtering av forespørsel og responsmeldinger.

ActionController gir et høyt nivå API for å lese forespørselsadressen, gjengi utdata og omdirigere til et annet sluttpunkt. Et sluttpunkt (aka rute) håndteres som en handlingsmetode. De fleste av de nødvendige kontekstinformasjonene i en handling-metode er gitt via be om, respons og params objekter.

  • Params: gir tilgang til nettadresseparametrene og POST-dataene.
  • forespørsel: inneholder informasjon om klienten, overskriftene og nettadressen.
  • svar: brukes til å angi overskrifter og statuskoder.
  • gjengi: gjengi visninger ved å utvide maler.
  • redirect_to: Omdirigere til en annen handling-metode eller URL.

ActionDispatch gir finkornet tilgang til forespørsel / responsmeldinger, via ActionDispatch :: Request og ActionDispatch :: Response klasser. Den avslører et sett med spørringsmetoder for å kontrollere typen forespørsel (få?(), post?(), hode?(), lokalt? ()). Forespørselheiser kan nås direkte via request.headers () metode.

På responssiden gir det metoder for å sette kapsler (), plassering = () og status = (). Hvis du føler deg eventyrlystne, kan du også sette legemet = () og omgå Rails rendering systemet.

jQuery Ajax

Fordi jQuery primært er et klientsidebibliotek, gir Ajax API det motsatte av et server-side rammeverk. Med andre ord, det tillater deg å lese svarmeldinger og modifisere be om meldinger. jQuery avslører en enkel API via jQuery.ajax (innstillinger):

Ved å passere en innstillinger objekt med beforeSend tilbakeringing, vi kan endre forespørselhodene. Tilbakeringingen mottar objektet jqXHR (jQuery XMLHttpRequest) som avslører en metode som kalles setRequestHeader () å sette overskrifter.

$ .ajax (url: 'http://www.articles.com/latest', type: 'GET', førSend: funksjon (jqXHR) jqXHR.setRequestHeader ('Accepts-Language', 'en-US, en '););
  • JqXHR-objektet kan også brukes til å lese svarhodene med jqXHR.getResponseHeader ().
  • Hvis du vil ta bestemte handlinger for ulike statuskoder, kan du bruke status Ring tilbake:
$ .ajax (statusCode: 404: function () alert ("siden ikke funnet"););

Sammendrag

Så oppsummerer vi vår hurtige gjennomgang av HTTP-protokollen.

Vi har gjennomgått nettadressestruktur, verb og statuskoder: de tre pilarene til HTTP-kommunikasjon.

Forespørsels- og svarmeldingene er stort sett de samme, med unntak av første linje og meldingshoder. Endelig har vi gjennomgått hvordan du kan endre forespørselen og svarhodene i webrammer og biblioteker.

Forstå HTTP er avgjørende for å ha et rent, enkelt og RESTful grensesnitt mellom to endepunkter. I større målestokk bidrar det også til å utforme nettverksinfrastrukturen og gi en god opplevelse til sluttbrukerne dine.

I del to, vi vurderer tilkoblingshåndtering, autentisering og caching! Ser deg da.


referanser

  • HTTP-spesifikasjon
  • HTTP Definitive Guide