HTTP Protokollet varje webbutvecklare måste veta - Del 1

HTTP står för Hypertext Transfer Protocol. Det är ett statlöst, applikationslager protokoll för kommunikation mellan distribuerade system och ligger till grund för den moderna webben. Som webbutvecklare måste vi alla ha en stark förståelse för detta protokoll.

Låt oss granska detta kraftfulla protokoll genom en webbutvecklares lins. Vi tar itu med ämnet i två delar. I den här första inledningen kommer vi att täcka grunderna och skissera de olika förfrågnings- och svarhuvudena. I uppföljningsartikeln granskar vi specifika delar av HTTP - nämligen cachning, anslutningshantering och autentisering.

Även om jag ska nämna några detaljer relaterade till rubriker är det bäst att i stället kontakta RFC (RFC 2616) för djup täckning. Jag kommer att peka på specifika delar av RFC genom hela artikeln.

Letar efter en snabb lösning?

Om du har problem med ett HTTP-fel i WordPress som du behöver fixa kan du beställa en Express HTTP-felkorrigering på Envato Studio och få felet fixat på en dag för bara $ 50.


HTTP-grunderna

HTTP möjliggör kommunikation mellan olika värdar och klienter, och stöder en blandning av nätverkskonfigurationer.

För att göra det möjligt antar det mycket lite om ett visst system och håller inte tillstånd mellan olika meddelandeutbyten.

Detta gör HTTP a statslös protokoll. Kommunikationen sker vanligen över TCP / IP, men någon tillförlitlig transport kan användas. Standardporten för TCP / IP är 80, men andra portar kan också användas.

Anpassade rubriker kan också skapas och skickas av kunden.

Kommunikation mellan en värd och en klient sker via en förfrågan / svarspar. Klienten initierar ett HTTP-förfrågningsmeddelande, som servas genom ett HTTP-svarmeddelande i gengäld. Vi kommer att titta på detta grundläggande budskapspar i nästa avsnitt.

Den nuvarande versionen av protokollet är HTTP / 1,1, vilket lägger till några extra funktioner till den tidigare 1.0-versionen. Den viktigaste av dessa, enligt min mening, innefattar ihållande anslutningar, chunked överföringskodning och finkorniga cachinghuvuden. Vi kommer kortfattat att ta reda på dessa funktioner i den här artikeln; Fördjupad täckning kommer att tillhandahållas i del två.

Webbadresser adresser~~POS=HEADCOMP

Kärnan i webbkommunikation är begäran, som skickas via Uniform Resource Locators (URLs). Jag är säker på att du redan är bekant med webbadresser, men för fullständighetens skull kommer jag att inkludera den här. Webbadresser har en enkel struktur som består av följande komponenter:

Protokollet är typiskt http, men det kan också vara https för säker kommunikation. Standardporten är 80, men man kan uttryckas explicit, som illustreras i bilden ovan. Resursvägen är lokal väg till resursen på servern.

Verb

Det finns också webbfelsökningsproxys, som Fifflare på Windows och Charles Proxy för OSX.

URL-adresser avslöjar identiteten för den specifika värd som vi vill kommunicera med, men åtgärden som ska utföras på värden specificeras via HTTP-verb. Självklart finns det flera åtgärder som en klient vill att värden ska utföra. HTTP har formaliserats på några fånga de väsentliga som är universellt tillämpliga för alla typer av applikationer.

Dessa begäran verb är:

  • SKAFFA SIG: hämta en befintlig resurs. Webbadressen innehåller all nödvändig information som servern behöver hitta och returnera resursen.
  • POSTA: skapa en ny resurs. POST-förfrågningar bär vanligen en nyttolast som anger data för den nya resursen.
  • SÄTTA: uppdatering en befintlig resurs. Lastlasten kan innehålla uppdaterade data för resursen.
  • RADERA: radera en befintlig resurs.

Ovanstående fyra verb är de mest populära, och de flesta verktyg och ramar exponerar uttryckligen dessa begäran verb. SÄTTA och RADERA betraktas ibland som specialiserade versioner av POSTA verb, och de kan vara förpackade som POSTA Förfrågningar med nyttolast som innehåller den exakta åtgärden: skapa, uppdatering eller radera.

Det finns några mindre använda verb som HTTP också stöder:

  • HUVUD: Detta liknar GET, men utan meddelandekroppen. Det brukar hämta serverns rubriker för en viss resurs, i allmänhet för att kontrollera om resursen har ändrats via tidsstämplar.
  • SPÅR: används för att hämta humlen som en förfrågan tar att resa runt från servern. Varje mellanproxy eller gateway skulle injicera sitt IP- eller DNS-namn i Via rubrikfält. Detta kan användas för diagnostiska ändamål.
  • ALTERNATIV: används för att hämta serverns kapacitet. På klientsidan kan den användas för att ändra begäran baserat på vad servern kan stödja.

Statuskoder

Med webbadresser och verb kan klienten initiera förfrågningar till servern. I gengäld svarar servern med statuskoder och meddelande nyttolast. Statuskoden är viktig och berättar klienten hur man tolkar serverns svar. HTTP-specifikationen definierar vissa talintervall för specifika typer av svar:

1xx: Informationsmeddelanden

Alla HTTP / 1.1-klienter är skyldiga att acceptera Transfer-Encoding rubrik.

Denna klass av koder introducerades i HTTP / 1.1 och är rent preliminärt. Servern kan skicka en Förvänta: 100-fortsätt meddelande, berätta för klienten om att fortsätta att skicka resten av begäran, eller ignorera om den redan har skickat den. HTTP / 1.0-klienter ska ignorera denna rubrik.

2xx: Framgångsrik

Detta berättar för kunden att förfrågan har bearbetats. Den vanligaste koden är 200 OK. För en SKAFFA SIG begäran skickar servern resursen i meddelandekroppen. Det finns andra mindre vanliga koder:

  • 202 Godkänd: Förfrågan accepterades men får inte inkludera resursen i svaret. Detta är användbart för asynkbehandling på serverns sida. Servern kan välja att skicka information för övervakning.
  • 204 Inget innehåll: Det finns ingen meddelandekropp i svaret.
  • 205 Återställ innehåll: Indikerar för klienten att återställa dokumentvy.
  • 206 Delvis innehåll: Indikerar att svaret endast innehåller delat innehåll. Ytterligare rubriker anger den exakta räckvidden och innehållsinformationen.

3xx: Omdirigering

404 indikerar att resursen är ogiltig och inte finns på servern.

Detta kräver att kunden vidtar ytterligare åtgärder. Det vanligaste användningsfallet är att hoppa till en annan URL för att hämta resursen.

  • 301 Flyttas permanent: resursen finns nu på en ny URL.
  • 303 Se Annat: Resursen är tillfälligt placerad på en ny URL. De Plats Svarhuvudet innehåller den temporära URL: en.
  • 304 Ej modifierad: servern har bestämt att resursen inte har ändrats och klienten ska använda sin cachade kopia. Detta beror på det faktum att klienten skickar ETag (Enttity Tag) information som är en hash för innehållet. Servern jämför detta med sin egen beräknade ETag att kontrollera om ändringar.

4xx: Klientfel

Dessa koder används när servern anser att kunden är fel, antingen genom att begära en ogiltig resurs eller gör en dålig begäran. Den mest populära koden i den här klassen är 404 Ej Hittad, som jag tror att alla kommer att identifiera med. 404 indikerar att resursen är ogiltig och inte finns på servern. De andra koderna i den här klassen är:

  • 400 Dålig förfrågan: begäran var felaktig.
  • 401 Obehörig: begäran kräver autentisering. Klienten kan upprepa förfrågan med Tillstånd rubrik. Om klienten redan inkluderade Tillstånd rubrik, då var uppgifterna felaktiga.
  • 403 Förbud: server har nekat åtkomst till resursen.
  • 405 Metod ej tillåtet: ogiltigt HTTP-verb som används i begäran, eller servern stöder inte det verbet.
  • 409 Konflikt: servern kunde inte slutföra begäran eftersom klienten försöker ändra en resurs som är nyare än klientens tidsstämpel. Konflikter uppstår mest för PUT-förfrågningar under samarbetande redigeringar på en resurs.

5xx: Serverfel

Denna klass av koder används för att ange ett serverfel när behandlingen behandlas. Den vanligaste felkoden är 500 Intern Serverfel. De andra i den här klassen är:

  • 501 Ej implementerat: servern stöder ännu inte den begärda funktionaliteten.
  • 503 Tjänst Otillgänglig: Det här kan hända om ett internt system på servern har misslyckats eller servern är överbelastad. Typiskt kommer servern inte ens att svara och förfrågan kommer timeout.

Meddelanden för förfrågnings- och svarmeddelanden

Hittills har vi sett det Webbadresser, verb och statuskoder utgöra de grundläggande delarna av ett HTTP-förfrågan / svarspar.

Låt oss nu titta på innehållet i dessa meddelanden. HTTP-specifikationen anger att en begäran eller ett svarmeddelande har följande generiska struktur:

meddelande =  * () CRLF []  = Request-Line | Status-Line  = Fältnamn ':' Fält-värde

Det är obligatoriskt att placera en ny linje mellan meddelandehuvud och kropp. Meddelandet kan innehålla en eller flera rubriker, av vilka de i stor utsträckning klassificeras i:

  • allmänna rubriker: Det gäller både förfrågnings- och svarmeddelanden.
  • begära specifika rubriker.
  • svarspecifika rubriker.
  • enheter rubriker.

Meddelandekroppen kan innehålla fullständiga entitetsdata, eller det kan vara piecemeal om den klumpiga kodningen (Överföring-kodning: chunked) är använd. Alla HTTP / 1.1-klienter är skyldiga att acceptera Transfer-Encoding rubrik.

Allmänna rubriker

Det finns några rubriker (allmänna rubriker) som delas av både förfrågnings- och svarmeddelanden:

general-header = Cache-Control | Anslutning | Datum | Pragma | Trailer | Transfer-Encoding | Uppgradera | Via | Varning

Vi har redan sett några av dessa rubriker, specifikt Via och Transfer-Encoding. Vi kommer att täcka Cache-Control och Förbindelse i del två.

Statuskoden är viktig och berättar klienten hur man tolkar serverns svar.

  • Via header används i ett TRACE-meddelande och uppdateras av alla intermittenta proxyer och gateways
  • Pragma anses vara en anpassad rubrik och kan användas för att inkludera implementeringsspecifika rubriker. Det vanligaste pragma-direktivet är Pragma: No-Cache, vilket verkligen är Cache-Control: no-cache under HTTP / 1.1. Detta kommer att beskrivas i del 2 i artikeln.
  • De Datum rubrikfält används för att stämpla förfrågan / svarmeddelandet
  • uppgradering används för att byta protokoll och tillåta en smidig övergång till ett nyare protokoll.
  • Transfer-Encoding brukar användas för att bryta svaret i mindre delar med Överföring-kodning: chunked värde. Detta är en ny rubrik i HTTP / 1.1 och möjliggör streaming av svar till klienten istället för en stor nyttolast.

Enhetshuvud

Anmälnings- och svarmeddelanden kan också innehålla enhetens rubriker för att ge meta-information om innehållet (t.ex. Meddelandeorgan eller Enhet). Dessa rubriker inkluderar:

entity-header = Tillåt | Content-Encoding | Innehållsspråk | Innehållslängd | Innehålls-plats | Innehåll-MD5 | Innehållsintervall | Innehållstyp | Löper ut | Senast ändrad

Alla Innehåll- prefixade rubriker ger information om strukturen, kodningen och storleken på meddelandekroppen. Vissa av dessa rubriker måste vara närvarande om enheten är en del av meddelandet.

De Utgår rubrik indikerar en tidsstämpel för vilken han eller hon upphör. Intressant, a "går aldrig ut" Enheten skickas med ett tidsstämpel om ett år till framtiden. De Senast ändrad rubrik anger den senaste ändringstidsstämpeln för enheten.

Anpassade rubriker kan också skapas och skickas av kunden; De kommer att behandlas som enhethuvuden med HTTP-protokollet.

Det här är verkligen en förlängningsmekanism, och vissa klient-server-implementeringar kan välja att kommunicera specifikt över dessa förlängningshuvuden. Även om HTTP stöder anpassade rubriker är det som söker efterfrågan och svarhuvudet, som vi täcker nästa.

Request Format

Förfrågningsmeddelandet har samma generiska struktur som ovan, förutom förfrågningsraden som ser ut som:

Request-Line = Metod SP URI SP HTTP-Version CRLF Metod = "OPTIONS" | "HEAD" | "GET" | "POST" | "PUT" | "DELETE" | "SPÅR"

SP är mellanseparatorn mellan tokens. HTTP-version anges som "HTTP / 1,1" och sedan följt av en ny linje. Således kan ett typiskt förfrågningsmeddelande se ut:

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

Observera förfrågningsraden följt av många begäranhuvuden. De Värd header är obligatoriskt för HTTP / 1.1-klienter. SKAFFA SIG Förfrågningar har inte ett meddelandeorgan, men POSTA Förfrågningar kan innehålla postdata i kroppen.

Förfrågningsrubrikerna fungerar som modifierare av begäran meddelande. Den fullständiga listan med kända begäranhuvuden är inte för lång och finns nedan. Okända rubriker behandlas som fält för enhetshuvud.

request-header = Acceptera | Acceptera-Charset | Accept-Encoding | Accept-Language | Auktorisation | Förvänta | Från | Värden | If-Match | Om-Modifierad-Sedan | If-None-Match | If-Range | Om-omodifierad-sedan | Max-framåt | Proxy-Authorization | Område | Referer | TE | User-Agent

De Acceptera prefixade rubriker anger de acceptabla medietyperna, språk och teckenuppsättningar på klienten. Från, Värd, referer och User-Agent Identifiera detaljer om den klient som initierade begäran. De Om- prefixade rubriker används för att göra en förfrågan mer villkorlig, och servern returnerar endast resursen om villkoret matchar. Annars returnerar den a 304 Ej modifierad. Villkoren kan baseras på en tidstämpel eller en ETag (en enhetens hash).

Svarformat

Svarformatet liknar begäran, med undantag för statusraden och rubrikerna. Statusraden har följande struktur:

Status-Line = HTTP-Version SP Status-kod SP Reason-Phrase CRLF
  • HTTP-version skickas som HTTP / 1,1
  • Statuskoden är en av de många statuserna som diskuterats tidigare.
  • Reason-Phrase är en läsbar version av statuskoden.

En typisk statusrad för ett lyckat svar kan se ut så här:

HTTP / 1.1 200 OK

Svarhuvudena är också ganska begränsade, och hela uppsättningen anges nedan:

 response-header = Accept-Ranges | Ålder | ETag | Plats | Proxy-Authenticate | Försök igen efter Server | Vary | WWW-Authenticate
  • Ålder är tiden i sekunder sedan meddelandet genererades på servern.
  • ETag är MD5-hash för enheten och brukade kontrollera efter ändringar.
  • Plats används när en omdirigering skickas och innehåller den nya webbadressen.
  • server identifierar servern som genererar meddelandet.

Det har varit mycket teori fram till den här tiden, så jag kommer inte att skylla dig för dåsiga ögon. I nästa avsnitt kommer vi att bli mer praktiska och undersöka verktygen, ramarna och biblioteken.


Verktyg för att visa HTTP-trafik

Det finns ett antal verktyg för att övervaka HTTP-kommunikation. Här listar vi några av de mer populära verktygen.

Utan tvekan, den Chrome / Webkit inspektör är en favorit bland webbutvecklare:

Det finns också webbfelsökningsproxys, som Fifflare på Windows och Charles Proxy för OSX. Min kollega Rey Bango skrev en utmärkt artikel om detta ämne.

För kommandoraden har vi verktyg som curl, tcpdump och tshark för övervakning av HTTP-trafik.


Använda HTTP i webbramar och bibliotek

Nu när vi har tittat på begäran / svarmeddelanden är det dags att vi lär oss hur bibliotek och ramar exponerar det i form av ett API. Vi ska använda ExpressJS för Node, Ruby on Rails, och jQuery Ajax som våra exempel.

ExpressJS

Om du bygger webbservrar i NodeJS är chansen hög att du har ansett ExpressJS. ExpressJS var ursprungligen inspirerad av ett Ruby Web-ramverk, kallat Sinatra. Som förväntat påverkas API också lika.

Eftersom vi hanterar ett serverns ramverk, finns det två primära uppgifter när vi hanterar HTTP-meddelanden:

  • Läs URL-fragment och begäranhuvuden.
  • Skriv svarhuvud och kropp

Förstå HTTP är avgörande för att ha ett rent, enkelt och RESTful gränssnitt mellan två ändpunkter.

ExpressJS ger ett enkelt API för att göra just det. Vi kommer inte att täcka detaljerna i API: n. Istället kommer vi att tillhandahålla länkar till den detaljerade dokumentationen om ExpressJS-guider. Metoderna i API är i de flesta fall självförklarande. Ett urval av API: n för begäran är nedan:

  • req.body: få förfrågan.
  • req.query: få sökfragmentet för webbadressen.
  • req.originalUrl
  • req.host: läser Värd rubrikfält.
  • req.accepts: läser de acceptabla MIME-typerna på klientsidan.
  • req.get ELLER req.header: läs något rubrikfält som passerat som argument.

På väg ut till klienten tillhandahåller ExpressJS följande respons API:

  • res.status: Ange en explicit statuskod.
  • res.set: Ange en specifik svarhuvud.
  • res.send: skicka HTML, JSON eller en oktet-ström.
  • res.sendFile: Överför en fil till klienten.
  • res.render: gör en uttrycklig vy mall.
  • res.redirect: vidarekoppla till en annan rutt. Express lägger automatiskt till standardomvandlingskoden för 302.

Ruby on Rails

Förfrågnings- och svarmeddelandena är mestadels desamma, förutom första raden och meddelandehuvuden.

I Rails tillhandahåller ActionController och ActionDispatch-modulerna API för hantering av förfrågan och svarmeddelanden.

ActionController tillhandahåller ett API på hög nivå för att läsa begäranadressen, göra utdata och omdirigera till en annan slutpunkt. En slutpunkt (aka-rutt) hanteras som en åtgärdsmetod. De flesta nödvändiga sammanhangsinformationen inom en åtgärdsmetod tillhandahålls via begäran, svar och params objekt.

  • Parametrar: ger tillgång till webbadressparametrar och POST-data.
  • begäran: innehåller information om klienten, rubrikerna och webbadressen.
  • svar: används för att ställa in rubriker och statuskoder.
  • render: gör synpunkter genom att expandera mallar.
  • redirect_to: omdirigera till en annan åtgärdsmetod eller webbadress.

ActionDispatch ger finkornad tillgång till begäran / svarmeddelanden, via ActionDispatch :: Request och ActionDispatch :: Response klasser. Det avslöjar en uppsättning av sökmetoder för att kontrollera typen av förfrågan (skaffa sig?(), posta?(), huvud?(), lokal?()). Förfrågningsrubriker kan nås direkt via request.headers () metod.

På svarsidan ger det metoder att ställa in småkakor(), plats = () och status = (). Om du känner dig äventyrlig kan du också ställa in kroppen = () och förbi Rails rendering system.

jQuery Ajax

Eftersom jQuery är främst ett klientsidebibliotek, ger Ajax API ett motsats till ett serverns ramverk. Med andra ord tillåter du det läsa svarmeddelanden och ändra begära meddelanden. jQuery avslöjar ett enkelt API via jQuery.ajax (inställningar):

Genom att passera en inställningar objekt med beforeSend återuppringning, vi kan ändra begäran rubriker. Återuppringningen tar emot objektet jqXHR (jQuery XMLHttpRequest) som avslöjar en metod som kallas setRequestHeader () för att ställa in rubriker.

$ .ajax (url: 'http://www.articles.com/latest', typ: 'GET', föreSänd: funktion (jqXHR) jqXHR.setRequestHeader ('Accept-Language', 'en-US, en '););
  • JqXHR-objektet kan också användas för att läsa svarhuvudena med jqXHR.getResponseHeader ().
  • Om du vill vidta specifika åtgärder för olika statuskoder kan du använda status ring tillbaka:
$ .ajax (statusCode: 404: function () alert ("sidan hittades inte"););

Sammanfattning

Så sammanfattar vi vår snabba rundtur i HTTP-protokollet.

Vi granskade URL-struktur, verb och statuskoder: de tre pelarna i HTTP-kommunikation.

Förfrågnings- och svarmeddelandena är mestadels desamma, förutom första raden och meddelandehuvuden. Slutligen har vi granskat hur du kan ändra begäran och svarhuvudet i webbramar och bibliotek.

Förstå HTTP är avgörande för att ha ett rent, enkelt och RESTful gränssnitt mellan två ändpunkter. I större skala hjälper det också till att utforma din nätverksinfrastruktur och ge en stor upplevelse till dina slutanvändare.

I del två ska vi granska anslutningshantering, autentisering och caching! Vi ses då.


referenser

  • HTTP-specifikation
  • HTTP-slutgiltig guide