!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

HTTP
GET
POST
HEAD
Børre Stenseth
Dokument >HTTP

HTTP

Hva
HyperText Transfer Protocol

HTTP er den underliggende protokollen som dominerer transport av dokumenter mellom klienter og tjenere på Internett. Vi vet at vi skriver: "http://" som start på en URL. Det vi da gjør er å angi hvilken protokoll som skal brukes. Dersom vi utelater protokollen, antar de fleste nettlesere HTTP som default. HTTP beskriver hvordan meldinger skal kodes og HTTP beskriver hva slags kommandoer, forspørsler, som skal kunne betjenes.

Hensikten med denne modulen er å trekke fram de mest sentrale delene av HTTP og hvordan vi forholder oss til dem når vi lager løsninger som innebærer kommunikasjon mellom en klient og en tjener. Vi tenker oss hele tiden at vi har en klient som sender forespørsler til en tjener som i sin tur forsøker å svare. Svaret er ofte oversendelse av en fil, men det som kommer tilbake kan også være produsert av et program.

HTTP protokollen finnes i to versjoner, HTTP 1.0 og HTTP 1.1. Denne modulen er skrevet for å få fram de viktigste komponentene og er ikke versjonsavhengig ut over de kommentarene der versjonen nevnes.

Et hendig verktøy for å inspisere hva som går fram og tilbake i en HTTP-dialog er Web-sniffer [1]

HTTP er tilstandsløs. Det vil si at hver melding som går mellom klient og tjener er historieløs. De to partene husker ikke at de har snakket sammen før. Dette er grunnen til at vi må ivareta sesjoner, lengre "samtaler", med spesielle tiltak som cookies, localstorage (i HTML5), skjulte felt eller programmering av tiltak på tjeneren. Se modulen Sesjoner .

HTTP beskriver et antall forespørsler som skal kunne betjenes. De viktigste er:

  • GET
  • POST
  • HEAD

Vi ser nærmere på en forspørsel - svar situasjon basert på GET, og kommenterer de andre etterpå.

GET

En forespørsel

En melding, forspørsel eller svar, har denne generelle formen:

startlinje
header (ingen, en eller flere header-linjer)
en blank linje
body (meldingsinnholdet, kan være tomt)

Vi ser først på en forespørsel, en henvendelse fra klienten til tjeneren. Den kan se slik ut:

GET /~borres/dw/http/p-http.html HTTP/1.1
Host: www.it.hiof.no

Startlinja angir metoden (GET), en filpath på tjeneren (/~borres/dw/http/) en ressurs som i dette tilfettel er en fil (p-http.html) og endelig protokollen (HTTP/1.1). Så har vi en headerlinje som er av den foreskrevne typen, navn: value, som beskriver tjeneren. Vi avslutter med en blank linje og har ingen body-del. Dette kan vi betrakte som en minimalistisk løsning for å få hentet den siden du ser på nå fra en tjener til en nettleser. Nettleserne er programmert til å sende mer informasjon som headere enn det som er vist ovenfor. Hvis vi bruker den "snifferen" som er referert nedenfor viser det seg at følgende sendes fra Mozilla Firefox når denne siden etterspørres (uten linjeskift i linjene for Accept og User-Agent):

GET /~borres/ml/http/p-http.html HTTP/1.1
Host: www.it.hiof.no
Connection: close
Accept-Encoding: gzip
Accept: text/xml,application/xml,application/xhtml+xml,
        text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) 
            Gecko/20050716 Firefox/1.0.6 Web-Sniffer/1.0.24
Referer: http://web-sniffer.net/

Uten å ta for oss alle detaljene så ser vi at netteleseren presenterer seg selv (User-Agent), hvilken side vi spør fra (Referer).

Et svar

Serverens svar på en slik forespørsel følger samme mønster: startlinje, headerlinjer, blank linje, body. I dette tilfellet er selve siden, den ressursen vi spør etter, body. Hvis vi bruker snifferen finner vi ut at svaret er slik:

HTTP/1.1 200 OK
Date: Thu, 18 May 2006 06:20:01 GMT
Server:	Apache/2.0.55 (Debian) mod_ssl/2.0.55 OpenSSL/0.9.8a PHP/4.4.2
Last-Modified: Thu, 18 May 2006 06:18:59 GMT
ETag: "63c002-2f53-2f9dac0"
Accept-Ranges: bytes
Content-Length:	12115
Connection: close
Content-Type: text/html; charset=ISO-8859-1

.. så kommer body som er selve vevsiden

Vi ser at serveren presenterer seg (Server), at den sier fra hvordan svaret er kodet (Content-Type) og vi ser i den første linja at den kvitterer med at dette gikk bra ( 200 OK). 200 er en standardisert kode, blandt mange andre, som sier noe om hvordan forespørselen forløp. OK er en tekslig utdyping av det samme.

GET et CGI-skript

Vi fortsetter å bruke GET som metode. Nå skal vi hente en ressurs som ikke er en fil. Vi skal referere til et CGI-skript i Python, og vi skal sende med en parameter, slik:

http://www.it.hiof.no/~borres/cgi-bin/forms/scripthttp0.py?message=Hallo

Forsøk å kopiere linja ovenfor inn i nettleserens adressefelt.
Skriptet som kalles ser slik ut:

_scripthttp0.py

Vi ser at vi har lagt til en parameter=verdi (message=Hallo) til selve URI'en. Den ressursen vi vil ha tak i er ikke en vanlig fil som tjeneren skal returnere. Det er et program, et CGI-skript, som skal kjøres. Arbeidsdelingen mellom tjener og skript krever noen kommentarer. Tjeneren må først tolke den URI'en den får og skille ut selve filadressen fra parameterdelen. Skriptet er plassert i katalogen cgi-bin. Tjeneren er satt opp slik at filer som ligger her må undersøkes nærmere. Tjeneren åpner fila og finner den første linja i skriptet:
#! /usr/bin/python2
I følge oppsettet på en Linux-tjener tolkes dette slik at fila skal kjøres av den applikasjonen som er angitt: /usr/bin/python2. Serveren starter Python, Python interpreterer vårt skript og finner informasjon hos tjeneren om det følger med en parameter verdi.

Så er det opp til skriptet å produsere et svar på forespørselen. Skriptet produserer headeren content-type og body. Det vil si at noen av headerene produseres av tjeneren. Hvis vi bruker snifferen, ser det slik ut (uten linjeskift i linjene for Accept og User-Agent):

GET /~borres/cgi-bin/forms/scripthttp0.py?message=Hallo HTTP/1.1
Host: www.it.hiof.no
Connection: close
Accept-Encoding: gzip
Accept: text/xml,application/xml,application/xhtml+xml,
        text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) 
            Gecko/20050716 Firefox/1.0.6 Web-Sniffer/1.0.24
Referer: http://web-sniffer.net/

Svaret på denne forespørselen ser slik ut:

HTTP/1.1 200 OK
Date: Thu, 18 May 2006 07:56:41 GMT
Server:Apache/2.0.55 (Debian) mod_ssl/2.0.55 OpenSSL/0.9.8a PHP/4.4.2
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=ISO-8859-1

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>forms-demo</title>
  </head>
  <body>
    <p>Serverskriptet har mottatt:</p>
    <h2>message: Hallo</h2>
    <p><a href="javascript:history.back()">Tilbake</a></p>
  </body>
</html>

HEAD

HEAD ghør i prinsipp det samme som GET, men returnerer bare headerinformasjon. Dette kan være nyttig hvis vi bare er interesserte i om en ressurs finnes eller når den er oppdatert.

POST

POST skiller seg fra GET på den måten at forespørselen har en body-del som ikke er tom. Vi kan overføre data til tjeneren i body i stedet for å hekte på parametere til URI'en slik vi gjør med GET. GET har den ulempen i forhold til POST at det er begrenset med data vi kan sende som parametere, og parameterne synes i nettleserens adressefelt. Når vi lager nettsider som skal kommunisere med en tjener gjør vi som regel det enten ved å bruke forms eller via AJAX (modulen AJAX ). I begge tilfellene kan vi velge om vi vil bruke GET eller POST som metode.

Diagnoser

Den første linja vi får tilbake på en forespørsel inneholder en angivelse av hvordan forespørselen gikk, f.eks: HTTP/1.1 200 OK. Det finnes en rekke standardisert koder som hjelper oss å tolke resultatet. Noen av de vanligste er:

200 OK Alt vel
404 Not Found Ressursen finnes ikke
500 Server Error Tjeneren feiler i å respondere på forespørselen. Typisk når et CGI-skript feiler

Du finner en komplett liste på definisjonen av HTTP/1.1, se referanser.

Andre protokoller

Det ligger utenfor dette materialet å gå nærmere inn på ulike lag av protokoller for transport av data på internettet. Det er imidlertid en rekke protokoller på øverste nivå i tillegg til HTTP. De mest kjente er vel FTP (file Transfer Protocol), SOAP (Simple Object Access Protocol,), SSH (Secure Shell) og Telnet. Du finner en inngangsnøkkel til disse på Wikipeadia [2] .

Referanser
  1. HTTP -sniffer Lingo4you - Sprachen Online Lernen web-sniffer.net/ 14-03-2010
  1. Hypertext Transfer Protocol Wikipedia en.wikipedia.org/wiki/Hypertext_Transfer_Protocol 14-10-2010
  1. HTTP W3C www.w3.org/Protocols/rfc2616/rfc2616.html 14-03-2010
  1. HTTP Made Really Easy James Marshall www.jmarshall.com/easy/http/ 14-03-2010
Vedlikehold
Børre Stenseth, mai 2006
( Velkommen ) Dokument >HTTP ( UR? )