Opettele ensin HTTP

Tämä blogikirjoitus on tuntemattomasta syystä, luultavasti tarpeettoman itsekritiikin takia julkaisematta jäänyt luonnos vuodelta 2010. Koska se on täysin sellaisenaan ihan validi tänäänkin, niin julkaisenpa sen nyt.

Jos pitäisi antaa yksi neuvo aloittelevalle web-ohjelmoijalle, niin se olisi ehdottomasti: opettele ihan ensimmäisenä tuntemaan HTTP.

Erityisesti tänä Ajax-sovellusten aikakautena on äärimmäisen tärkeää osata seurata ja tulkita HTTP-liikennettä normaalin kehitystyön aikana tai kun selvitellään miksi web-sovellus toimii väärin. Jos et tiedä miten teet tämän, et oikein voi kutsua itseäsi web-ohjelmoijaksi.

URI, statuskoodit, Content-Type, välimuisti- ja proxymekanismit ja keksien toiminta ovat ensimmäisenä mieleen tulevia tärkeitä HTTP:n osasia. Ei riitä, että osaat nämä käyttämäsi sovelluskehyksen API:n tasolla.

Kun perusteet ovat hallussa, kannattaa ehdottomasti lukea RESTful Web Services. Se opettaa suunnittelemaan verkkopalvelut niin kuin HTTP on tarkoitettu toimivaksi. Railsin kehittäneen David Heinemeier Hanssonin sanoin:

Every developer working with the Web needs to read this book.

Vaikka kirja voisi olla paremmin kirjoitettu, sen sisältämä filosofia on niin oleellinen, ettei sitä voi jättää lukematta.

Hyvä haastattelukysymys web-ohjelmoijan paikkaa hakevalle voisi olla, että mikä kirjoitusvirhe on päätynyt HTTP-otsikkokentän nimeksi standardiin asti. No ehkä ei, mutta ainakin se on hauskaa knoppitietoa.

Web-sivun kieli, osoitteessa vai ei?

Lue myös kaksiosaisen artikkelisarjan ensimmäinen osa: Kieli URL:ssä.

URL-osoitteiden hallinta on www-sivuston, julkaisujärjestelmän tai web-frameworkin avainkohtia. Joskus URL:ssä on tarve näyttää dokumentin kieli. Koska ja miksi?

Kieli URL:ssä on tarpeeton, jos sivusto ei tarjoa sisältöä kuin yhdellä kielellä. Sitä ei sinne kannata varmuuden vuoksi laittaa, vaikka sisältö joskus tulevaisuudessa saattaa laajentua. Kaikki ylimääräinen URL:ssä lisää osoitteiden monimutkaisuutta ja mitä monimutkaisempi URL, sen vaikeakäyttöisempi.

Sisältöneuvottelu

HTTP:n Content Negotiation, sisältöneuvottelu, on tekniikka, jolla voidaan vaikuttaa siihen, mikä versio sisällöstä tarjoillaan User-Agentille eli yleensä selaimelle ja sitä kautta käyttäjälle. Continue reading “Web-sivun kieli, osoitteessa vai ei?”

Get vai post?

Nimimerkki VV kysyi, mitä tarkoitin seuraavilla 101-listani kohdilla:

  • hakulomakkeet käyttävät getiä, eivät postia ja
  • getiä käytetään vain, kun pyyntö ei muuta tilaa.

Lomakkeen lähetystapa voidaan HTML:ssä valita form-elementin method-attribuutin arvolla. Vaihtoehtoja ovat HTTP:n verbit get ja post. Get tarkoittaa, että lomake toimii ikään kuin linkinrakennustyökaluna, post taas sitä, että lomakkeen tiedot eivät välity URL:ssä. Getin käyttö mahdollistaa esimerkiksi hakutuloksiin linkittämisen, postia käytettäessä URL ei riipu hakusanoista.

HTML 4.01:n spesifikaatio sanoo seuraavaa:

The “get” method should be used when the form is idempotent (i.e., causes no side-effects). Many database searches have no visible side-effects and make ideal applications for the “get” method.

If the service associated with the processing of a form causes side effects (for example, if the form modifies a database or subscription to a service), the “post” method should be used.

Suomeksi: jos pyynnöllä ei ole sivuvaikutuksia, lomakkeen tulisi käyttää getiä. Hakulomakkeilla sivuvaikutuksia harvoin on. Sivuvaikutuksia voivat olla mitkä tahansa tilaa muuttavat pyynnöt. Esimerkiksi näidenkin juttujen kommentoinnin mahdollistavan lomakkeen lähettäminen muuttaa tilaa, tässä tapauksessa sivun sisältöä.

Koska post muuttaa tilaa, mutta get ei, osaa selain varoittaa käyttäjää tarvittaessa. Jos palaan selaimen back-toiminnolla sivulle, jota kutsuttiin postilla, selain varmistaa, että todella haluan tehdä tuon pyynnön. Jos get muuttaa tilaa, selain ei voi suojella siltä, koska muuten sen olisi varoitettava jokaisesta sivulatauksesta ja varoitus menettäisi merkityksensä.

Samaan ongelmaan törmäsi vasta itse Sam Ruby linkittäessään Bloglinesin sivuun, joka listaa kaikki vielä lukemattomat merkinnät ja merkitsee ne samalla luetuiksi. Lukija klikkasi linkkiä varomattomuuttaan ja menetti samalla tiedon lukemattomista viesteistään.

Näiden sanojen ei todennäköisesti kuuluisi olla linkkejä: kirjaudu ulos, muokkaa, siirrä, poista, käynnistä itsetuho…