HTTP-pyynnöt

Kirjoitin aikanaan Aalto-yliopiston kokeiluluontoisille ”Interactive mathematics”-blogisivuille tynkäkurssia verkko-ohjelmoinnista, koska pidin sitä tuolloin ja pidän edelleenkin, tärkeänä asiana nykyisessä työelämässä. Valitettavasti kyseinen ”www.intmath.org”-sivusto hävisi jossakin vaiheessa bittitaivaaseen, joten joudun soveltuvilta osin keksimään samat artikkeliteemat uudelleen muutamista alkeisaiheista. Onneksi en ollut päässyt järin pitkälle siinä, koska en tyhmyyksissäni ottanut artikkeleistani varmuuskopioita.

Melkein kaikki Internetissä verkkoselainten kautta käsiteltävä materiaali perustuu nykyään HTTP-pyyntöihin ja lähetyksiin. HTTP on lyhenne termistä HyperText Transfer Protocol, eli se käsittelee ”hypertekstiä”, joka voi tarkoittaa joko verkkosivua tai jotakin abstraktimpaa tietuetta, joka käsitellään ja näytetään tietyllä tavoin. HTTP:n ideana on, että sekä pyynnöt, jotka lähetetään verkkopalvelulle ja verkkopalvelun antamat vastaukset ovat määrämuotoisia. Testataan seuraavaksi empiirisesti, millaisia ovat mahdolliset pyynnöt.

Jos kirjoitetaan jollakin tekstieditorilla seuraavanlainen yksinkertainen Java-ohjelma:

import java.net.*;

public class ServerSocketTest {

    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(10025);
        Socket s = ss.accept();
        while (true) {
            System.out.print((char) (s.getInputStream().read()));
            System.out.flush();
        }
    }
}

käännetään se käskyllä

$ javac ServerSocketTest.java

ja ajetaan käskyllä

$ java ServerSocketTest

saadaan aikaiseksi omalle koneelle yksinkertainen verkkopalvelu porttiin 10025, joka vain näyttää sinne tulleet pyynnöt, muttei osaa vastata mitään. Tämä riittää meille tässä vaiheessa, jotta voisimme tarkastella muutamia tyypillisiä tapauksia.

Ohjatessa Firefox-verkkoselain kyseiseen osoitteeseen, saadaan konsolille:

GET / HTTP/1.1
Host: localhost:10025
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fi-fi,fi;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

Olennaista tässä on seuraava osa:

GET / HTTP/1.1
Host: localhost:10025

eli on pyydetty osoitetta localhost:10025 ja sieltä polkunimeä /. Pyyntöön olisi mahdollista liittää myös monimutkaisempikin polkunimi tai parametreja, joita käsitellään myöhemmin. Laaditaan seuraavaksi POST-toiminnon testaamista varten verkkolomake, jonka voi tallentaa mihin tahansa hakemistoon:

<form action="http://localhost:10025" method="post"/>
    <input name="kenttä1"/>
    <input name="kenttä2"/>
    <input type="submit"/>
</form>

ja lähetetään sen tulos keksimällä kenttiin sopivat merkkijonot (kenttä1=”Oracle”, kenttä2=”Gräsantörmä”) ja painamalla ”Lähetä”-nappia. Lopputulos on seuraavankaltainen:

POST / HTTP/1.1
Host: localhost:10025
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fi-fi,fi;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 50

kentt%C3%A41=Oracle&kentt%C3%A42=Gr%E4sant%F6rm%E4

Havaitaan, että korrekteissa POST-pyynnöissä kerrotaan, kuinka pitkä dokumentti lähetetään (Content-Length) ja parametrit välitetään tässä ”jälkikirjoituksessa”, mistä nimi ”POST” ilmeisesti tuleekin. Kaikki merkit, jotka eivät kuulu US-ASCII-alueelle, kuten ä ja ö tai euron merkki, koodataan %-alkuisin erikoismerkein.