Interfície de programació d'aplicacions (API, de les sigles en anglès) de la Diputació de Barcelona.
Què fa l’API?
Una API o interfície de programació d’aplicacions és un conjunt de mètodes que recuperen dades perquè puguin ser processades per altres aplicacions.
Un cop es coneix l’estructura de les dades, només cal cridar els mètodes corresponents, tenint en compte que es poden combinar els mètodes entre si.
Pots navegar pels diferents apartats de la documentació tècnica de l'API REST de dades obertes, utilitzar el nostre cercador de documentació o descarregar-te la versió completa per imprimir.
Cercador de documentació Versió per imprimir
Una API o interfície de programació d’aplicacions és un conjunt de mètodes per recuperar dades perquè puguin ser processades per altres aplicacions.
REST és una arquitectura de software per a sistemes hipermedia. Actualment REST és el terme que s'utilitza per descriure tota interfície entre sistemes que utilitzi el protocol HTTP per a determinar operacions a ser executades sobre un conjunt de dades o directament obtenirles, formatades i sense les complicacions pròpies de realitzar aquesta tasca a un nivell més directe.
Un cop es coneix l’estructura de les dades, només cal cridar els mètodes corresponents, tenint en compte que es poden combinar els mètodes entre si.
A nivell general utilitzem els següents conceptes:
Tipus de contingut: Definim un tipus de contingut concret a partir d'un nombre arbitrari de camps, grups i relacions. Exemple: El tipus de contingut “acte”, tindria tots els camps relatius a un acte (títol, localització, data d'inici i finalització, etc.).
Dataset: Definim un dataset com un conjunt de dades d'un tipus de contingut concret; per exemple, l'agenda d'actes de les biblioteques. Un dataset és un subconjunt del tipus de contingut. Exemple: el dataset “Agenda de museus” i el dataset "Agenda de les biblioteques" tenen dades del tipus de contingut “acte”.
Relació: Les relacions ens permeten connectar dades d'un tipus de contingut amb un dataset concret o un altre tipus de contingut. Per exemple, podem definir un dataset que sigui la llista de municipis i un tipus de contingut per a actes, podent relacionar totes dues dades a partir d'un identificador únic (codi INE). La gràcia de tenir les dades relacionades és que al recuperar la informació, també és possible recuperar les dades relacionades dins de la mateixa crida. La relacions es poden fer entre tipus de continguts o entre tipus de contingut i dataset (que no és altre cosa que un sub-conjunt de dades del tipus de contingut). Exemple: El tipus de contingut “recinte” estan relacionats amb el tipus de contingut “municipi” a través del codi INE, llavors, quan recuperéssem un recinte, també recuperem la informació del municipi on està ubicat.
Grup: Un grup és un conjunt o agrupació de camps.
Camp: Els camps defineixen els diferents valors que pot tenir un tipus de contingut. Els camps tenen diferents propietats:
Nom: Una etiqueta per referenciar el camp.
Nom màquina: Nom per identificar el camp en l'interacció amb la API.
Pes: Valor que s'utilitza per ordenar els camps dins d'un registre.
Primari: Indica que aquest camp identifica el registre del que forma part, per tant, també té un valor únic dins el mateix dataset.
Multivaluat: Indica que el camp pot pendre més d'un valor.
Obligatori: Indica que en tot registre del dataset aquest camp ha de tenir un valor assignat.
Únic: Indica que el valor del camp no es pot repetir en la resta de registres d'un mateix dataset.
Tipus: Indica com està definit el valor del camp. Pot ser: booleà, data, decimal. email, enter, geolocalització, text, text llarg o url.
L'API només és de consulta, via REST i utilitza URLs “netes” per a les crides. Per tant, no hi ha paràmetres GET, sinó que en el seu lloc utilitza un sistema de parelles de paràmetre i valor.
La ruta és: http://do.diba.cat/api/_CRIDA_
On _CRIDA_
te la forma parametre1/valor1/parametre2/valor2/ ... /parametreN/valorN
Totes les dades són accessibles en format CSV, XML, RDF-XML i JSON (per defecte). Els resultats en format XML, RDF-XML i JSON contindran l'estructura interna de camps i grups que s'ha definit; en canvi, el format CSV per la seva naturalesa només permet els valors dels camps de forma lineal sense estructura. Per als camps multiavaluats en format CSV, s'utilitza un caràcter separador “;” per separar els diferents valors dins d'un mateix camp: “valor1_camp1”,”valor1_camp2;valor2_camp2;valor3_camp2”,”valor1_camp3”...
No importa l'ordre en què es cridin els parells. Si els paràmetres tenen un valor per defecte i no incloem a la ruta el valor d’un paràmetre que és obligatori, aquest prendrà el valor per defecte.
Un concepte clau que està definit en tots els tipus de continguts, datasets i camps és el machine_name o nom-màquina. Es tracta d’un valor preparat especialment perquè l’utilitzi el software i les màquines, que no canvia mai i que no conté cap caràcter especial, ni espais en blanc i es limita al subconjunt de caràcters ASCII-96. Aquest valor s’utilitza com a identificador i és ideal per utilitzar en totes les crides independentment del joc de caràcters utilitzat, perquè el subconjunt ASCII-96 és comú en tots els jocs de caràcters; per tant, sempre que sigui possible s’ha de treballar amb el machine_name.
Informació de l'estructura | info/datasets info/tipus |
Selecció de dades | dataset/[dataset] tipus/[content_type] |
Operadors de comparació | camp-[field]/[value] camp-[field]-like/[value] camp-[field]-ornull/[value] camp-[field]-greater/[value] camp-[field]-greaterequal/[value] camp-[field]-lower/[value] camp-[field]-lowerequal/[value] |
Operadors lògics | camp-[field]/[value1]++[value2] camp-[field]/[value1]||[value2] |
Agregació | agrega/[field] |
Paginació | pag-ini/[value1]/pag-fi/[value2] pag-ini/[value1] pag-fi/[value2] |
Ordenació | ord-[field]/asc ord-[field]/desc |
Format | format/json format/xml format/csv format/rdf-xml |
Idioma | idioma/ca idioma/es idioma/en |
Ordenació per proximitat | geord-camp/[field]/geord-cord/[lat,lng] |
Filtre per proximitat | ubicacio/[lat,lng]/geocamp/[field]/radi/[value] |
Cerca de text lliure | camp-all/[value] camp-all-like/[value] |
L'API de dades obertes consta de diferents tipus de camps i cada camp pot tenir diferents propietats:
text | Camp de text curt. Fins a un màxim de 256 caràcters. |
ltext | Camp de text llarg. Més de 256 caràcters. |
geo | Coordenades de latitud i longitud. S'utilitza el punt pels decimals i la coma per separar la latitud de la longitud. Per exemple: 41.43535,2.134242. |
url | Camp URL o localitzador uniforme de recursos. |
Camp de correu electrònic. | |
date | Camp de data amb el format 31/12/2017 12:00:00 |
Relació | Camp que relaciona el dataset amb un altre dataset. |
Clau primària | Camp identificador del recurs. Sempre està informat i és únic. |
Multivaluat | El camp permet més d'un valor. |
Obligatori | El camp és obligatori. |
Únic | El valor del camp és únic i no es repeteix en cap altre registre. |
A l'apartat recuperació de la informació dels camps i l'estructura pots veure com consultar els tipus dels camps d'un dataset i les seves propietats.
Crida |
~/info/tipus{/tipus/machine_name} ~/info/datasets{/dataset/machine_name} |
Paràmetres |
/info/tipus: Retorna les estructures (camps, grups i relacions) de TOTS els tipus de contingut definits a la API, no els valors dels seus camps. Amb aquesta crida es poden aconseguir els machine_name dels tipus de contingut. /info/tipus/tipus/machine_name: Amb aquesta crida aconseguim de nou l'estructura, però en aquest cas, per a un únic tipus de contingut concret determinat pel machine_name d'aquest. /info/datasets: Retorna les estructures (camps, grups i relacions) de TOTS els datasets definits a la API, no els valors dels seus camps. Amb aquesta crida es poden aconseguir els machine_name dels datasets. /info/datasets/dataset/machine_name: Amb aquesta crida aconseguim de nou l'estructura, però en aquest cas, per a un únic dataset concret determinat pel machine_name d'aquest. |
Exemples |
https://do.diba.cat/api/info/tipus https://do.diba.cat/api/info/tipus/tipus/acte https://do.diba.cat/api/info/tipus/tipus/punt https://do.diba.cat/api/info/datasets |
Crida |
~tipus/[content_type] ~dataset/[dataset] |
Paràmetres |
/tipus/[content_type]: Retorna TOTS els datasets (estructurats i amb valors) que son del tipus de contingut especificat per content_type. /dataset/[dataset]: Retorna els camps del dataset especificat per dataset. |
Exemples |
https://do.diba.cat/api/tipus/municipi https://do.diba.cat/api/tipus/acte/pag-fi/100 https://do.diba.cat/api/tipus/punt https://do.diba.cat/api/dataset/municipis |
Crida |
~/camp-[field]-like/[value] |
Paràmetres |
/camp-[field]-like/[value]: Retorna aquells camps d'un dataset o tipus de contingut que tinguin value en el camp identificat per field. Si s'utilitza la directiva -like es retornaran valors aproximats (p.ex: allà on value sigui substring). |
Exemples |
http://do.diba.cat/api/tipus/bibliobus/camp-nom/Bibliobús Montnegre https://do.diba.cat/api/dataset/municipis/camp-municipi_transliterat/tiana https://do.diba.cat/api/dataset/escenari/camp-titol-like/viaje |
Important! |
Aquest filtre no funciona aïllat, és necessari especificar tipus/tipus_contingut o dataset/nom_dataset. En el cas que el camp sigui data, hi ha dos possibles formats:
|
Crida |
~/agrega/[field1]{/agrega/[field2]} |
Paràmetres |
/agrega/[field1]{/agrega/[field2]}: Retorna l'agregació de tots els camps especificats pels field# d'un mateix dataset. |
Exemples |
https://do.diba.cat/api/dataset/electes/agrega/carrec_persona/agrega/sexe https://do.diba.cat/api/dataset/biblioteques/agrega/municipi_nom |
Crida |
~camp-[field]/[value1]++[value2] ~camp-[field]/[value1]||[value2] |
Paràmetres |
|| , ++: Retorna tots aquells camps que (sent multivaluats) tinguin:
|
Exemples |
http://do.diba.cat/api/dataset/actesbiblioteques_ca/camp-dies/Dilluns||Dijous https://do.diba.cat/api/dataset/actesbiblioteques_ca/camp-tags/Taller++Infants |
Crida |
~/camp-[field]-greater/[value] ~/camp-[field]-greaterequal/[value] |
Paràmetres |
/camp-[field]-greater/[value]: retorna totes les dades amb el valor del camp amb field més gran que value. /camp-[field]-greaterequal/[value]: retorna totes les dades amb el valor del camp amb field més gran o igual que value. |
Exemples |
https://do.diba.cat/api/dataset/puntesports_detall/camp-punt_esport_nombre_espais-greaterequal/7 https://do.diba.cat/api/dataset/actesmuseus/camp-data_inici-greater/datetime:now |
Crida | ~/camp-[field]-like/[value] |
Paràmetres |
/camp-[field]-like/[value]: retorna totes les dades del camp amb field amb un valor aproximat a value. |
Exemples |
https://do.diba.cat/api/dataset/municipis/camp-municipi_transliterat-like/castell https://do.diba.cat/api/dataset/museus/camp-adreca_nom-like/roma |
Crida |
~/camp-[field]-lower/[value] ~/camp-[field]-lowerequal/[value] |
Paràmetres |
/camp-[field]-lower/[value]: retorna totes les dades d'un registre que tingui un camp amb field i amb valor més petit que value. /camp-[field]-lowerequal/[value]: retorna totes les dades d'un registre que tingui un camp amb field i amb valor més petit o igual que value. |
Exemples |
https://do.diba.cat/api/dataset/puntesports_detall/camp-punt_esport_nombre_espais-lowerequal/6 https://do.diba.cat/api/dataset/actesmuseus/camp-data_inici-lower/datetime:now |
Crida |
~/camp-[field]-ornull/[value] |
Paràmetres |
/camp-[field]-ornull/[value]: retorna totes les dades d'un registre que tingui un camp amb field amb el mateix valor que value o NULL. |
Exemples |
https://do.diba.cat/api/dataset/actesbiblioteques_ca/camp-preu-ornull/10 |
Crida |
~/camp-all/[value] ~/camp-all-like/[value] |
Paràmetres |
/camp-all/[value]: retorna tots els registres amb algun camp amb el mateix valor que value. /camp-all-like/[value]: retorna tots els registres amb algun camp amb el mateix valor que value o aproximat. |
Exemples |
https://do.diba.cat/api/dataset/biblioteques/camp-all-like/berga |
Crida |
~/pag-ini/[value1] ~/pag-fi/[value2] ~/pag-ini/[value1]/pag-fi/[value2] |
Paràmetres |
/pag-ini/[value1]: retorna els registres a partir del value1. /pag-fi/[value2]: retorna els registres fins al value2. /pag-ini/[value1]/pag-fi/[value2]: retorna tots els registres des del value1 fins al value2. |
Exemples |
https://do.diba.cat/api/dataset/escenari/pag-ini/40/pag-fi/60 |
Important! |
Per motius de rendiment per defecte qualsevol consulta torna els 1000 primers resultats. |
Interfície de programació d'aplicacions (API, de les sigles en anglès) de la Diputació de Barcelona.
API de dades obertes del Cercador d'Informació i Documentació Oficials (CIDO)
Fes servir els visors mapa, graella i calendari per visualitzar les dades de cada recurs.
Aquests són els formats estàndards, estructurats i interoperables amb què publiquem les nostres dades.
Les dades enllaçades (en anglès, linked data) són un mètode de publicació de dades estructurades perquè puguin ser interconnectades entre elles i resultin més útils.
Exemples de codi opensource que utilitzen l'API de dades obertes preparats per a ser reutilitzats.
Crida |
~/ord-[field]/asc ~/ord-[field]/desc |
Paràmetres |
/ord-[field]/asc: retorna els registres ordenats ascendentment agafant com a camp d'ordenació field. /ord-[field]/desc: retorna els registres ordenats descendentment agafant com a camp d'ordenació field. Es pot ordenar per més d'un camp, tot i que l'ordre marca la jerarquia. |
Exemples |
https://do.diba.cat/api/tipus/municipi/ord-municipi_nom/desc https://do.diba.cat/api/tipus/municipi/ord-municipi_nom/asc https://do.diba.cat/api/tipus/municipi/ord-comarca_nom/desc/ord-municipi_nom/asc |
Crida |
~/geord-camp/[field]/geord-cord/[lat,lng] |
Paràmetres |
/geord-camp/[field]/geord-cord/[lat,lng]: retorna els registres amb el camp field més propers geogràficament a [lat,lng]. |
Exemples |
https://do.diba.cat/api/dataset/municipis/geord-camp/localitzacio/geord-cord/41.34220,-2.2678 |
Crida |
~/ubicacio/[lat,lng]/geocamp/[field]/radi/[value] |
Paràmetres |
/ubicacio/[lat,lng]/geocamp/[field]/radi/[value]: retorna els registres amb el camp field més propers geogràficament a [lat,lng] amb radi value. |
Exemples |
http://do.diba.cat/api/dataset/municipis/ubicacio/41.5606948,1.523511/geocamp/localitzacio/radi/ |
Alguns tipus de camps permeten tipat, això ens permet indicar que el filtre, la comparació o l'ordenació que estem indicant s'ha de fer utilitzant una conversió de format concreta enlloc de fer-ho per text.
Per exemple, si volem recuperar tots els actes posteriors al 23/06/2016 podem indicar-li que per fer la comparació utilitzi una data i ignori la hora amb el tipat ":date": camp-[field]-greater/date:2016-06-23, o si volem els actes entre les 9h del matí i les 17h de la tarda podem utilitzar el tipat ":datetime" perquè tingui en compte els hores i utilitzar dos filtres: camp-[field]-greaterequal/datetime:2016-06-23_09:00:00/camp-[field]-loweerequal/datetime:2016-06-23_17:00:00
Tipats disponibles:
Els valors màgics són variables reservades que defineix el sistema, i que permet, per exemple recuperar les activitats del dia amb una URL estàtica sense haver-li de passar el dia actual podent inscrutar dades en webs estàtiques a tarvés de widgets.
Valors màgics disponibles
Exemples:
Llista d'actes que comencen avui: https://do.diba.cat/api/tipus/acte/camp-data_inici/date:now
No es necessita cap token per utilitzar l'API de dades obertes i per consultar qualsevol dada de datasets públics.
Els tokens són seqüències de valors alfanumèrics que es poden afegir a les crides de l'API i que s'utilitzen amb propòstis estadístics i per donar accés a datasets privats.
Els tokens els facilita la Diputació de Barcelona i aquests poden ser variables en funció d'un algoritme que fa que el token vagi canviant segons una clau pública i privada o poden ser estàtics i no canviar mai.
Hi ha tres mètodes diferents per fer una crida amb token:
Per motius de seguretat es recomana utilitzar preferentment pels tokens HEADERS o POST i crides HTTPS sempre, i en últim terme GET i HTTP si només s'utiliza el token per motius estadístics i no es pot implementar per POST o HEADER.
Crida |
~/format/json |
Paràmetres |
/format/json: retorna el dataset en el format JSON, aquesta és la opció per defecte. /format/xml: retorna el dataset en el format XML. /format/csv: retorna el dataset en el format CSV. /format/rdf-xml: retorna el dataset en el format RDF-XML. |
Exemples |
http://do.diba.cat/api/dataset/actesbiblioteques_ca/format/rdf-xml |
Formats disponibles |
JSON https://do.diba.cat/api/dataset/municipis (per defecte) http://do.diba.cat/api/dataset/municipis/format/json XML https://do.diba.cat/api/dataset/municipis/format/xml CSV https://do.diba.cat/api/dataset/municipis/format/csv RDF https://do.diba.cat/api/dataset/municipis/format/rdf-xml |
Crida |
~/idioma/ca ~/idioma/es ~/idioma/en |
Paràmetres |
~/idioma/ca: retorna el dataset en català si es troba disponible. ~/idioma/es: retorna el dataset en castellà si es troba disponible. ~/idioma/en: retorna el dataset en anglès si es troba disponible. |
Exemples |
Finalment, cal tenir en compte que els criteris i paràmetres són combinables entre ells, tot i que s’ha d’entendre que la combinació pot no retornar resultats.
Aquesta crida ens tornarà les dades del municipis i ens tornarà els primers 10 resultats ordenats per proximitat a la coordenada 41.5606948,1.523511 que s’ha indicat.
Exemples diversos:
Llista dels conjunts de dades disponibles:
https://do.diba.cat/api/info/datasets
Llista dels tipus de continguts disponibles:
https://do.diba.cat/api/info/tipus
Llista de temes o àmbits temàtics d'actuació de la Diputació de Barcelona:
https://do.diba.cat/api/dataset/temes
Llista de municipis de la província de Barcelona:
https://do.diba.cat/api/dataset/municipis
Llista dels municipis de la província de Barcelona en format XML:
https://do.diba.cat/api/dataset/municipis/format/xml
Llista d'actes de la cartellera dels espais escènics municipals:
https://do.diba.cat/api/dataset/escenari
Tots els punts d'interès de qualsevol conjunt de dades:
https://do.diba.cat/api/tipus/punt
Tots els actes de qualsevol conjunt de dades:
https://do.diba.cat/api/tipus/acte/pag-fi/100
Els 10 punts d'interès més propers a Santa Coloma de Gramenet (41.453889,2.211111):
https://do.diba.cat/api/tipus/punt/geord-camp/localitzacio/geord-cord/41.453889,2.211111/pag-ini/1/pag-fi/10
Registres modificats avui en el dataset de biblioteques:
https://do.diba.cat/api/dataset/biblioteques/camp-_lastChange/date:now
Registres modificats amb data igual o superior a l’1 de febrer de 2015 a les 15:00h en el dataset municipis:
https://do.diba.cat/api/dataset/biblioteques/camp-_lastChange-greaterequal/datetime:2015-02-01_15:00:00
Biblioteques a 1000 metres de distància de la coordenada 41.37,2.18:
https://do.diba.cat/api/dataset/biblioteques/format/json2/ubicacio/41.37,2.18/geocamp/localitzacio/radi/1000
L'API té un sistema de memòria cau per millorar el rendiment que evita haver de processar les mateixes consultes de forma repetitiva. Per tant, quan es fa una crida a l'API aquesta s'enmagatzema en una memòria cau del servidor i, si se li torna a demanar la mateixa petició exacta, torna la resposta emmagatzemada directament de la memòria cau.
Aquesta memòria cau s'anomena APICache i té una persistència de 12 hores, així que tota crida realitzada de forma repetitiva es manté invariable durant almenys 12 hores, encara que durant aquest interval hi hagi hagut una modificació de les dades. Quan es modifica una dada l'API pot trigar de 0 a 12 hores a servir la modificació.
Per saber si les dades que estàs consumint s'han generat en aquell moment o han estat servides directament per la memòria cau, les respostes incorporen una propietat anomenada cache al final de totes les respostes. Aquesta propietat indica el dia i hora exactes en què es va guardar aquella resposta en memòria cau. Si les dades no incorporen aquesta propietat, és perquè la resposta s'ha generat en aquell precís moment i, per tant, no s'han servit de l'APICache.
Exemple: cache:"2017-06-07 03:13:19"
La data i hora estan en temps universal UTM.
Per tant, a la freqüència d'actualització de les dades que indiquen els datasets cal afegir-hi un marge adicional de 12 hores, que és el temps màxim que pot trigar a propagar-se el canvi a través de la memòria cau de l'API.
Pets consultar exemples de codificació que utilitzen l'API de dades obertes perparats per a ser reutilitzats.
DKAN (la plataforma de gestió de dades de codi obert basada en Drupal, sobre la qual està construït aquest portal) ofereix una API per recuperar informació del catàleg de dades que normalment s'utilitza per sindicar continguts amb altres portals. L'APIs de DKAN es pot fer servir per recuperar metadades dels datasets.
L'API de DKAN és una API addicional i complementària a la nostra API de dades obertes.
Llista dels datasets disponibles | https://dadesobertes.diba.cat/api/3/action/package_list |
Catàleg de dades DCAT en format JSON | https://dadesobertes.diba.cat/catalog.json |
Catàleg de dades DCAT amb format XML | https://dadesobertes.diba.cat/catalog.xml |
Llista de recursos en format JSON | https://dadesobertes.diba.cat/data.json |
Llista de publicadors de dades | https://dadesobertes.diba.cat/api/3/action/group_list |
Catàleg de dades amb recursos | https://dadesobertes.diba.cat/api/3/action/current_package_list_with_res... |
Pots consultar més informació sobre les APIs de DKAN en aquest web.