Kirjastohakemiston rajapinta

Dokumentin versio v1.01

Rajapinnan versio v1.1

1 Johdanto

Tämä dokumentti määrittelee Kirjastot.fi:n kirjastohakemiston REST-­ra­ja­pinnan, 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ä­li­muis­tiin 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 vastaavas­ti 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:

arvokäyttö
organisationkirjastot, toimipisteet, ym.
serviceyhteisesti määritetyt palvelut
organisation/serviceskirjastoissa 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:

tyyppiarvomerkitys
kaikkisummaryydintiedot
organisationdetailskaikki tiedot paitsi aukioloajat
organisationhoursaukioloajat, sijainti sekä kirjaston minimaaliset tiedot
organisationhierarchykirjastojen organisaatiopuu
organisationserviceskirjastojen ja niiden palveluiden ydintiedot
organisationallyhdistelmä scopeista details ja hours
organisationminimalvain nimi- ja tunnistetiedot
organisation/servicesminimalvain nimi- ja tunnistetiedot
organisation/servicesdetailskaikki tiedot
5.2.2.1 Aukioloajat

Aukioloajat palautetaan, jos document-type on organisation, ja pyynnössä on parametri scope=hours.

Aukioloaikojen lisäparametrit:

parametriarvooletusmerkitys
startYYYY-MM-DD tai nownowmistä päivästä asti aukioloajat annetaan
endYYYY-MM-DD tai nowstart:hin arvomihin päivään asti aukioloajat annetaan
fullweekstyhjä tai true tai ttruejos 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. 2012-02-22 Wed

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 palau­tetaan 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:

arvopakollinenmerkitys
withkylläJokaisen with-hakuehdon on oltava tosi jokaisella
tulosjoukon jäsenellä. (must)
anyeiVähintään yhden any-hakuehdon on oltava tosi
jokaisella tulosjoukon jäsenellä. Eri tulosjoukon jäsenillä voi
olla eri osuman aiheuttava hakuehto. (should)
withouteiJokaisen 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.

  1. Haetaan palveluita, joita kirjasto-organisaatiot tosiasiassa tarjoavat, eli rajataan haluttu kirjastojoukko ja pyydetään listaus näiden kirjastojen tarjoamista palveluista.
  2. Haetaan yksittäisen tai useamman palvelun tietoja yhteisistä palvelu­malleista, 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"

Tekijä: Kirjastot.fi, Timo Tuominen <etu piste sukunimi at kirjastot fi>

Päivämäärä: 03.05.2012

HTML generated by org-mode 6.30c in emacs 23