HTTP
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:
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] .