HTTP-pyynnöt (osa 2)

Tässä artikkelissa esitetään muutamia tarkennuksia edelliseen. Jos käynnistetään edellisen artikkelin mukainen kaappausohjelma ja ohjataan selain osoitteeseen:

http://localhost:10025/this/is/my/path?a=1;b=2

sisältää tämä sekä polkunimen, että GET-parametreja. Lopputulos on seuraavanlainen:

GET /this/is/my/path?a=1;b=2 HTTP/1.1
Host: localhost:10025
...

mistä ylimääräiset rivit on poistettu. Olennaista on, että polkunimi on ’/’-merkeistä huolimatta vain merkkijono yhdistettynä parametrimerkkijonon kanssa, eikä suinkaan tarkoita, että missään tarvitsisi olla tiedostojärjestelmää, jossa oikeasti olisi kansiorakennetta ’this/is/my/path’. Minua hävettää tunnustaa, että tällaiset tosiseikat hämäsivät minua vielä sellaisessakin vaiheessa kun olin jo päässyt tietotekniikan alan töihin, mutta ehkä niin oli parempi :-). Vastaanottava verkkosovellus päättää itsenäisesti siitä, mitä tuollaisiin pyyntöihin vastataan.

Edellisessä artikkelissa käsiteltiin POST-pyyntöjen ominaisuutta, jossa parametrit olivat pyynnön loppuosassa. Sama pätee myös vielä käsittelemättömiin PUT- ja DELETE-pyyntöihin. Tärkeintä on se, ettei GET-pyyntöjä käytetä väärin, koska vaikka ne tavanomaisimpina, ovat kuitenkin tietyllä tavalla ”suojatumpia”. GET-pyyntöjä ei saa koskaan käyttää tilanteissa, joissa pyyntö saattaa muuttaa palvelimen sisäistä tilaa esimerkiksi niin, että tietokantoihin tallennettaisiin jotakin tai niistä poistettaisiin jotakin. GET-pyyntöjen sisällöt saattavat myös päätyä selainten varmuuskopiotiedostoihin (cache), joista ne saatetaan ottaa myöhemmissä pyynnöissä varsinaisen kohteen tutkimisen sijasta, jos aikaa edellisestä pyynnöstä ei ole kulunut riittävästi, POST-pyyntöjen osalta näin ei tapahdu.

POST-, PUT- ja DELETE-pyyntöjen ero on symbolinen, POST-pyyntöjä suositellaan käytettäväksi tilanteissa, joissa halutaan muuttaa palvelun tilaa, PUT-pyyntöjä tilanteissa, joissa palveluun halutaan lisätä jotakin ja DELETE-pyyntöjä tilanteissa, joissa palvelusta halutaan poistaa jotakin.


Posted

in

,

by

Tags: