Kirjastohakemiston rajapinta
Dokumentin versio v1.01
Rajapinnan versio v1.1
1 Johdanto
Tämä dokumentti määrittelee Kirjastot.fi:n kirjastohakemiston REST-rajapinnan, jonka kautta voi lukea kirjastojen tietoja.
2 Palvelinosoitteet
Pääpalvelin on api.kirjastot.fi, sen alias on api1.kirjastot.fi ja varapalvelin on osoitteessa api2.kirjastot.fi Jos mahdollista, tulee varapalvelinta käyttää virhetilanteissa.
Kaikkiin rajapintakutsuihin liitetään rajapinnan versionumeron
kokonaislukuosa ('v' sekä numero pisteen vasemmalla puolella), esim:
api.kirjastot.fi/v1/
3 Tietojen tallennus välimuistiin
Rajapinnasta haetun datan tallentaminen dataa käyttävän järjestelmän välimuistiin on suositeltavaa.
Mikäli mahdollista, tieto tulee jättää välimuistiin talteen erilaisia poikkeustilanteita varten, joissa datan hakeminen rajapinnasta estyy.
Rajapintaan kohdistuvien pyyntöjen määrän on pysyttävä kohtuullisena, esim. max 50 pyyntöä minuutissa.
Suositeltavinta on noudattaa HTTP:n välimuisteja koskevia otsakkeita:
Cache-Control: max-age Expires
Kannattaa siis käyttää välimuistiin tallennettua versiota datasta niin pitkään kuin se ei ole näiden otsakkeiden mukaan vanhentunutta.
Jos em. otsakkeita ei voi käyttää, hyvä perusaika välimuistiin tallennetun tiedon vanhenemiselle on 10 minuuttia, jolloin kirjastohakemistoon tehdyt korjaukset ja muutokset tulevat kohtuullisella viiveellä julkaisujärjestelmään.
4 Datan formaatti
Rajapintakutsut noudattavat HTTP:n Accept
-otsaketta. Jos
datan haluaa JSON-muodossa, oikea otsake on Accept: application/json
,
ja vastaavasti XML-muodossa Accept: application/xml
.
Jos Accept
-otsakkeiden käyttö ei ole mahdollista, ks. formaatin
määrittäminen kutsuparametreista (myöhemmin): esim. format=json
tai
format=xml
.
XML-versio on suoraviivainen muunnos JSON-versiosta, toisin sanoen JSON-formaatin avaimet vastaavat XML-formaatin tagin nimeä, JSON:in arvot ovat XML-formaatin tagin tekstisisältö. XML-attribuuttien arvoja ei käytetä tietosisällön välittämiseen.
JSON-versiossa esiintyvien nimeämättömien rakenteisten olioiden elementtinimi
XML-versiossa on object
. Esimerkiksi hakutuloksissa yhden kirjaston tiedot on
esitetty yhden <object></object>
-tagiparin sisällä.
Esimerkiksi alla on osa JSON-dokumentista.
{ "branch_type": "default", "consortium": "helmet", "contact": { "building_architect": "Arkitektbyr\u00e5n Pekka Salminen KY", "building_en": "", "building_fi": "Kanneltalo", "building_interior_designer": "Arbetsgruppen (?) Osmo Honkanen, Markku Liukkonen och Pekka Salminen", "building_se": "", "building_sv": "Gamlasg\u00e5rden", "building_year": "1992", "coordinates": "24.8762093603988,60.2388470216001,0", "directions_en": "", "directions_fi": "M-juna (Vantaankosken rata), Bussit 41,42,43,43b (40-sarja)", "directions_se": "", "directions_sv": "", "email": "kannelmaen_kirjasto@hel.fi", "homepage_en": "http://www.lib.hel.fi/en-gb/kannelmaki", "homepage_fi": "http://www.lib.hel.fi/fi-FI/kannelmaki/", "homepage_se": "", "homepage_sv": "http://www.lib.hel.fi/sv-fi/kannelmaki" } }
Vastaavat tiedot XML-muodossa:
<branch_type>default</branch_type> <consortium>helmet</consortium> <contact> <building_architect>Arkitektbyrån Pekka Salminen KY</building_architect> <building_en></building_en> <building_fi>Kanneltalo</building_fi> <building_interior_designer> Arbetsgruppen (?) Osmo Honkanen, Markku Liukkonen och Pekka Salminen </building_interior_designer> <building_se></building_se> <building_sv>Gamlasgården</building_sv> <building_year>1992</building_year> <coordinates>24.8762093603988,60.2388470216001,0</coordinates> <directions_en></directions_en> <directions_fi> M-juna (Vantaankosken rata), Bussit 41,42,43,43b (40-sarja) </directions_fi> <directions_se></directions_se> <directions_sv></directions_sv> <email> kannelmaen_kirjasto@hel.fi</email> <homepage_en>http://www.lib.hel.fi/en-gb/kannelmaki</homepage_en> <homepage_fi>http://www.lib.hel.fi/fi-FI/kannelmaki/</homepage_fi> <homepage_se></homepage_se> <homepage_sv> http://www.lib.hel.fi/sv-fi/kannelmaki</homepage_sv> </contact>
JSON on ensisijainen formaatti. Muunnos on suoraviivainen, eikä XML:lle ole määritelty skeemoja tai dokumenttityyppimäärityksiä.
XML:n merkistökoodaus on UTF-8.
JSON:in merkistökoodaus noudattaa IETF:n JSON-spesifikaation RFC:n 4627 http://tools.ietf.org/html/rfc4627 (kappale 2.5) tapaa merkitä ASCII-merkistön ulkopuoliset merkit.
5 Rajapintakutsujen muoto
Tietojen hakeminen rajapinnasta onnistuu HTTP GET-pyynnöillä, joissa parametrit annetaan suoraan URL:in query-parametreina.
URL-osoitteita varten ASCII-merkistön ulkopuoliset merkit muunnetaan ensin UTF-8-koodauksen mukaiseksi merkkijonoksi jonka UTF-tavut koodataan prosenttimerkin avulla: http://tools.ietf.org/html/rfc3986.
5.1 Pyyntöjen yleinen muoto
Kaikki kutsut alkavat API:n palvelinosoitteella sekä dokumentin tyypillä. Sen jälkeen annetaan tarkentavat tunnisteet ja parametrit:
http://api.kirjastot.fi/<api-version>/<document-type>/<id>?<parameters>
document type on pakollinen tieto ja yksi seuraavista:
arvo | käyttö |
---|---|
organisation | kirjastot, toimipisteet, ym. |
service | yhteisesti määritetyt palvelut |
organisation/services | kirjastoissa oikeasti olevat palvelut |
ns. fasetteina |
id koskee vain tapauksia, joissa noudetaan yksittäisen dokumentin tiedot,
yleensä kirjaston. Usean dokumentin hauissa id:n tilalla on search
.
parameters on joukko URL-kyselyparametreja. Jos id on määritetty, kysymysmerkin ja kyselyparametrit voi jättää pois.
Esimerkki kokonaisesta URL-osoitteesta:
http://api.kirjastot.fi/v1/organisation/ab4393251?format=json&scope=hours
Parametrit ovat avain-arvo pareja ja noudattavat seuraavaa syntaksia.
parameters := pair ["&" parameters] | <empty> pair := key=value
Parametrien merkitykset määritellään alla.
5.2 Yleiset parametrit
Yleiset parametrit ovat käytössä kaikissa pyynnöissä. Jotkin scope-arvot ovat dokumenttityyppikohtaisia.
5.2.1 Formaatti format
Pyydettävän datan formaatti annetaan ensisijaisesti HTTP:n
Accept
-otsakkeessa. Jos se ei ole mahdollista, voi käyttää URL:n
parametria format
:
format=json
tai format=xml
.
5.2.2 Pyydettävän tiedon laajuus scope
Määrittää, mitä kenttiä palautettavassa datassa on mukana.
Huom! Yleensä on pyydettävä ainoastaan data, joka tarvitaan. Erityisesti aukioloajat kannattaa noutaa mahdollisimman harvoin.
Kenttiä ei määritellä yksitellen, vaan mahdolliset kenttäjoukot on ennalta määritelty alla oleviin profiileihin:
tyyppi | arvo | merkitys |
---|---|---|
kaikki | summary | ydintiedot |
organisation | details | kaikki tiedot paitsi aukioloajat |
organisation | hours | aukioloajat, sijainti sekä kirjaston minimaaliset tiedot |
organisation | hierarchy | kirjastojen organisaatiopuu |
organisation | services | kirjastojen ja niiden palveluiden ydintiedot |
organisation | all | yhdistelmä scopeista details ja hours |
organisation | minimal | vain nimi- ja tunnistetiedot |
organisation/services | minimal | vain nimi- ja tunnistetiedot |
organisation/services | details | kaikki tiedot |
5.2.2.1 Aukioloajat
Aukioloajat palautetaan, jos document-type on organisation
, ja
pyynnössä on parametri scope=hours
.
Aukioloaikojen lisäparametrit:
parametri | arvo | oletus | merkitys |
---|---|---|---|
start | YYYY-MM-DD tai now | now | mistä päivästä asti aukioloajat annetaan |
end | YYYY-MM-DD tai now | start :hin arvo | mihin päivään asti aukioloajat annetaan |
fullweeks | tyhjä tai true tai t | true | jos parametri on mukana, start ja end |
mukautetaan viikon rajoihin: | |||
start -> start :ia edeltävä maanantai | |||
end -> end :iä seuraava sunnuntai) |
Esimerkiksi Arabianrannan kirjaston tämän viikon aukioloajat:
http://api.kirjastot.fi/v1/organisation/TQKf-DMpSgGgr_SbR5FpYQ?scope=hours&start=now&fullweeks
5.2.2.2 Organisaatiohierarkia
Tätä toimintoa ei ole vielä toteutettu.
Arvolla scope=hierarchy
rajapinta palauttaa seuraavanlaisen
tietorakenteen, joka ilmaisee organisaatioiden väliset
hierarkiasuhteet. Hierarkialla ilmaistaan, mikä organisaatio
kuuluu hallinnollisesti minkäkin organisaation alle, esimerkiksi
Helsingin kaupunginkirjasto > Rikhardinkadun kirjasto >
Lastenosasto.
Seuraava esimerkki kuvaa tämänkaltaista hierarkiaa: (sisennys kuvaa hierarkiatasoja.)
kirjasto 1 kirjasto 1-1 kirjasto 1-1-1 kirjasto 1-2 kirjasto 2 kirjasto 2-1
Yllä olevan hierarkian esitys JSON-muodossa:
[ "<id1">: { "name_fi": "name1", "children": [ "<id1-1>": { "name_fi": "name1-1", "children": [ "<id1-1-1-1>": { "name_fi": "name1-1-1", "children": [] } ] }, "<id1-2>": { "name_fi": "name-1-2", "children": [] } ] }, <id2>: { "name_fi": "name2", "children": [ "<id2-1">: { "name_fi": "name2-1", "children": [] } ] } ]
XML-muunnos on edelleen suoraviivainen:
<result> <object> <id>id1</id> <name_fi>name1</name_fi> <children> <object> <id>id1</id> <name_fi>name1-1</name_fi> <children> [...] </children> </object> <object> <id>id1</id> <name_fi>name1-1</name_fi> <children> [...] </children> </object> </children> </object> [...] </result>
5.3 Yksittäisen dokumentin pyytäminen
http://api.kirjastot.fi/v1/<document type>/<document id>
document id on dokumentin kirjastohakemiston6 sisäinen id-tunnus.
Esimerkiksi Arabianrannan kirjasto:
http://api.kirjastot.fi/v1/organisation/TQKf-DMpSgGgr_SbR5FpYQ
Yksittäisessä muodossa ei ole pakollista URL:n query-osaa.
5.4 Usean dokumentin pyytäminen
http://api.kirjastot.fi/<api-version>/organisation/search?[search parameters]&[general parameters]
Yleiset parametrit [general parameters] on käsitelty yllä ja ne koskevat niin hakuja kuin yksittäisen resurssin pyyntöä.
Kaikissa pyynnöissä, jotka palauttavat usean dokumentin, dokumentit
palautetaan yhden results
-elementin sisällä:
JSON:
{ "results": [ ... ], "page":2, "next":3 }
XML:
<response> <results> <object>...</object> ... </results> <page>2</page> <next>3</next> </response>
5.4.1 Sivutus page
page
-parametri on kokonaisluku alkaen luvusta 1
.
Jos sivu on viimeinen, tulosjoukon next
-kentän arvo on "none".
Muussa tapauksessa kentän arvo on seuraavan sivun sivunumero.
Jos page
-parametrin jättää pois, palautetaan kaikki tulokset.
5.4.2 Järjestäminen sort
sort
-parametri määrittää, minkä kentän mukaan tulokset
järjestetään nousevaan aakkosjärjestykseen. Parametrin arvo on
kentän nimi, esimerkiksi name_fi
tai name_sv
.
Huomaa, että koordinaattihaussa tulokset järjestetään etäisyyden
mukaan silloin, kun sort
parametria ei ole erikseen annettu.
Jos parametrina annetaan virheellinen kenttänimi, parametri jätetään huomiotta.
5.4.3 Hakuparametrit
Rajapinnan haut noudattavat boolen logiikkaa:
arvo | pakollinen | merkitys |
---|---|---|
with | kyllä | Jokaisen with -hakuehdon on oltava tosi jokaisella |
tulosjoukon jäsenellä. (must) | ||
any | ei | Vähintään yhden any -hakuehdon on oltava tosi |
jokaisella tulosjoukon jäsenellä. Eri tulosjoukon jäsenillä voi | ||
olla eri osuman aiheuttava hakuehto. (should) | ||
without | ei | Jokaisen without -hakuehdon on oltava epätosi jokaisella |
tulosjoukon jäsenellä. (must not) |
Hakuun voi lisätä yhdestä useampaan hakuparametria, jotka kaikki
noudattavat muotoa [parameter type]=[field name]:[value]
.
Jos value on lainausmerkeissä, kyseessä on eksakti haku, muulloin sanahaku kentän sisään. Huom tällä hetkellä sanahakua ei tueta.
Jos haluaa poistaa tulosjoukosta arvoja tietyllä ehdolla, voi käyttää
without
-parametria, joka toimii with
:iin nähden käänteisesti
(poistaa tulosjoukosta dokumentteja joissa on tietyt arvot). Pelkällä
without
-parametrilla ei voi hakea.
Esim. haetaan Helmet-alueen kirjastot:
http://api.kirjastot.fi/v1/organisation/search?with=consortium:helmet
Haetaan kirjastot, joissa on täsmällisesti nimetty palvelu DVD-soitin, mutta joissa ei ole palvelua pelihuone.
http://api.kirjastot.fi/v1/organisation/search?with=services.name_fi:"DVD-soitin"&without=services.name_fi:pelihuone
Haetaan Helmet-kirjastot, joissa on joko lukusali tai soittohuone (tai molemmat):
http://api.kirjastot.fi/v1/organisation/search?with=consortium:helmet&any=services.name_fi:"Lukusali"&any=services.name_fi:"Soittohuone"
5.4.4 Koordinaattihaku
Koordinaattihaulla haetaan kirjastot, jotka sijaitsevat tietyllä etäisyydellä annetusta pisteestä.
Esimerkiksi kirjastot, jotka ovat Pasilassa olevasta pisteestä 2 kilometrin säteellä:
http://api.kirjastot.fi/v1/organisation/search?with=consortium:helmet&scope=minimal&location=60.201889,24.9345264&distance=2km
Esimerkin mukaisesti location
-parametrin arvo on muodossa <leveysasteet(latitude)>,<pituusasteet(longitude)>
WGS84-koordinaattijärjestelmässä. Distance-arvo annettaan kilometreissä, muodossa <etäisyys>km.
Numeroarvot ovat kokonaislukuja tai desimaalilukuja, desimaalierottimena piste.
5.5 Palvelut
Kirjastohakemistossa on mahdollisuus ylläpitää yhteisesti listaa palveluista, joita kirjastot voivat tarjota. Palveluita voidaan määrittää esimerkiksi kirjastokimppakohtaisesti.
Yksittäisiin kirjastoihin voidaan sitten tallentaa viitteitä kyseisiin mallipalveluihin, jolloin näiden palveluiden tiedot tallennetaan automaattisesti osaksi kirjaston omaa palveluvalikoimaa.
Palveluhakuja on tästä syystä kahdenlaisia.
- Haetaan palveluita, joita kirjasto-organisaatiot tosiasiassa tarjoavat, eli rajataan haluttu kirjastojoukko ja pyydetään listaus näiden kirjastojen tarjoamista palveluista.
- Haetaan yksittäisen tai useamman palvelun tietoja yhteisistä palvelumalleista, riippumatta siitä, esiintyykö näitä palveluita kirjastoissa.
5.5.1 Kirjastojen tarjoamat palvelut
Palveluhaku palauttaa halutun kirjastojoukon kaikki tarjotut palvelut (tapaus 1).
Palveluita haetaan näin:
http://api.kirjastot.fi/v1/organisation/services/search?[search parameters]
Huom. Dokumenttityyppi on kaksiosainen (organisation/services
),
koska palvelut ovat organisaatioiden alakenttiä.
Huom. services
on monikossa.
Palveluita haettaessa voidaan hakua rajoittaa lähinnä kirjastojen kentillä (mukaanlukien kirjastoissa olevien palveluiden kentillä).
Hakurajaukset rajoittavat kirjastojoukkoa, jonka kaikki palvelut palautetaan rajapintakutsun tuloksena.
Esimerkiksi Helmet-kirjastojen tarjoamat palvelut:
http://api.kirjastot.fi/v1/organisation/services/search?with=consortium:helmet
5.5.2 Yhteiset mallipalvelut
Yksittäisen mallipalvelun tiedot saa näin (tapaus 2):
http://api.kirjastot.fi/v1/service/<service-id>?[parameters]
Mallipalveluita voi myös hakea esim. nimellä:
http://api.kirjastot.fi/v1/service/search?with=name_fi:"Lukusali"
Päivämäärä: 03.05.2012
HTML generated by org-mode 6.30c in emacs 23