Käytäthän rajapintaa gzip-pakkaus tuettuna?

234 views
Skip to first unread message

Solita / Heikki

unread,
Oct 20, 2016, 9:40:33 AM10/20/16
to rata.digitraffic.fi
Hei!

Digitraffic-palvelu on tukenut aina HTTP vastauksen gzip-pakkausta. Pakkauksen käyttö edellyttää, että käyttäjäsovellus on lähettänyt tiedon tuestaan pakkaukselle pyynnön mukana. Pakkauksen käyttö nopeuttaa vastauksen saamista sekä pienentää tietoliikennekuormaa rajapintapalvelun ja sen käyttäjän välillä.

Rajapintasovelluksiin tulee (mobiili, Python, PHP, Java yms.) tulee joissakin tapauksissa manuaalisesti lisätä hyväksyntä pakkaukselle pyyntöjen yhteyteen. Parhaan tiedon oman kirjaston, käyttötavan yms. tuesta saat esimerkiksi google haun kautta.

Lisätietoa asiasta löytyy esimerkiksi täältä: 


Esimerkiksi pyynnön otsikkotietueena toimii seuraava, jolla pakkaus aktivoituu päälle:

Accept-Encoding: gzip

Teemu Sirkiä

unread,
Oct 20, 2016, 11:48:45 AM10/20/16
to rata.digitraffic.fi
On tosiaan varsin harmillista, että esimerkiksi Pythonin perus-APIin kuuluva urllib tai Noden http eivät oletusarvoisesti osaa pyytää sisältöä pakattuna ja purkaa vastausta, vaikka nykymaailmassa lienee enemmänkin jo poikkeus, ettei palvelin tue vastauksen pakkaamista.

Tosin koodailu on muutenkin paljon helpompaa, kun käyttää parempaa kirjastoa nettiliikenteeseen. Esim. Pythonille Requests ja Nodelle SuperAgent. Kumpikin noista osaa hoitaa oikeiden headereiden lähettämisen ja vastauksen purkamisen automaattisesti. Kummankin kirjaston tarjoama ohjelmointirajapintakin on merkittävästi käyttäjäystävällisempi kuin noiden peruskirjastojen. Voin suositella näistä kumpaakin.

Selaimessa toimivissa sovelluksissa tätä asiaa ei tarvitse (eikä edes oikein voi) huomioida, koska selain hoitaa nettiliikenteen.

Vielä vähän konkretiaa pakkauksen hyödystä: päivän aikatauludumppi on pakkaamattomana n. 13 megaa, pakattuna 460 kt.

Teemu Sirkiä

unread,
Oct 20, 2016, 11:58:46 AM10/20/16
to rata.digitraffic.fi
Tosin ei se nyt Pythonilla ole kovin hankalaa muutenkaan.

import json
from gzip import GzipFile
from urllib.request import urlopen, Request

url = 'http://rata.digitraffic.fi/api/v1/live-trains'
with urlopen(Request(url, headers={"Accept-Encoding": "gzip"})) as response, GzipFile(fileobj=response) as gf:
    data = json.loads(gf.read().decode('utf-8'))
    for x in data:
        print(x['trainType'], x['trainNumber'])

Tällainen template kannattaa pitää aina käden ulottuvilla, kun ei koskaan tiedä, milloin iskee tarve saada jotain jännää dataa ulos. :-)

Ei muuten olisi varmaan mikään huono idea, jos olisi jossain jotain pieniä koodiesimerkkejä, joilla pääsisi kätevästi alkuun.
Reply all
Reply to author
Forward
0 new messages