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…
Hienoa, että GET:n ja POST:n oikeaan käyttöön kiinnitetään huomiota. Seuraava vaihe onkin muiden verbien hyödyntäminen :)
(Tuon Sam Ruby -linkin kautta löytyi vielä tämmöistä luettavaa:
http://www.w3.org/2001/tag/doc/whenToUseGet.html)