Gör detta innan lektion

Lös kapitlen Downloading Files and Using API Clients, Using httr to interact with APIs directly och Handling JSON and XMLDataCamp.

Läs: Kapitel 1-3 i An introduction to APIs

Resurser:

Under lektion

a-pi

Skriv en funktion

get_pi <- function(start, numberOfDigits){
    ...
}

som anropar a-pi och returnerar siffrorna i \(\pi\) från start till start + numberOfDigits - 1. Ett anrop görs med t.ex. https://api.pi.delivery/v1/pi?start=1000&numberOfDigits=5.

TimeEdit

Ett TimeEdit-schema kan fås i JSON-format genom att ändra .html till .json i länken, prova i webb-browser med https://se.timeedit.net/web/su/db1/stud1/ri107345X65Z06Q5Z86g2Y30y0076Y32Q05gQY5Q55727.html

Vi kan använda GET för att hämta till R

library(httr)
schema_response <- GET("https://se.timeedit.net/web/su/db1/stud1/ri107345X65Z06Q5Z86g2Y30y0076Y32Q05gQY5Q55727.json")
schema_json <- content(schema_response, "text")

För att utforska resultatet kan vi använda jsonedit i paketet listviewer

library(knitr)
library(tidyverse)
library(jsonlite)
library(listviewer)
jsonedit(schema_json)

Vi konverterar med fromJSON och plockar ut reservations

schema_df <- fromJSON(schema_json)$reservations

Resultatet är en data.frame med sex kolumner, där den sista kolumnen innehåller en vektor i varje cell. För att få ut element ur denna kolumn använder vi mutate i kombination map_chr. Familjen av map-funktioner kommer vi prata mer om i slutet av kursen, i detta fall motsvaras map_chr(columns, 1) av sapply(columns, function (x) x[1]) i bas-R.

schema_df %>% mutate(sal = map_chr(columns, 3), 
                     kurs = map_chr(columns, 1), 
                     tid = paste(starttime, endtime, sep = " - ")) %>% 
    select(kurs, datum = startdate, tid, sal) %>% 
    kable()
kurs datum tid sal
MT5013 2018-01-15 09:15 - 12:00 Sal 32
MT5013 2018-01-17 09:15 - 12:00 Sal 32
MT5013 2018-01-18 12:45 - 15:30 Sal 32
MT5013 2018-01-22 12:45 - 15:30 Sal 32
MT5013 2018-01-25 12:45 - 15:30 Sal 32
MT5013 2018-01-29 12:45 - 15:30 Sal 32
MT5013 2018-01-31 09:15 - 12:00 Sal 32
MT5013 2018-02-01 12:45 - 15:30 Sal 32
MT5013 2018-02-05 12:45 - 15:30 Sal 32
MT5013 2018-02-08 12:45 - 15:30 Sal 32
MT5013 2018-02-12 12:45 - 15:30 Sal 32
MT5013 2018-02-15 12:45 - 15:30 Sal 32
MT5013 2018-02-19 12:45 - 15:30 Sal 32
MT5013 2018-02-22 12:45 - 15:30 Sal 32
MT5013 2018-02-27 13:00 - 17:00 Sal 36
MT5013 2018-03-12 12:45 - 16:00 Sal 32

Bokningarna för sal 14 under vårterminen hittar du på

https://se.timeedit.net/web/su/db1/stud1/ri157345X69Z07Q5Z76g0Y30y0076Y31Q09gQY5Q55777.html

  • vilken lärare är mest schemalagd i sal 14?

SCB

Om du genererat en tabell i Statistikdatabasen hittar du längst ned en länk “API för denna tabell” som ger en url och en fråga som skall ställas med POST för att hämta tabellen. Prova hämta en tabell med httr::POST, frågan skall anges i funktionens body-parameter. Tips: längst ned i frågan kan du byta "format": "px" mot "format": "json" för att få svaret i JSON-format. Hämta en tabell, undersök strukturen och försök plocka ut en lämplig data.frame.

Senaste dygnet på Bromma

Senaste dygnets timvisa temperaturobservationer (parameter 1) på Bromma (station 97200) kan hämtas från SMHI med (byt xml mot json för att ändra format)

temp_response <- GET("https://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/97200/period/latest-day/data.xml")
http_type(temp_response)
## [1] "application/xml"

Vi konverterar till XML-format med

library(xml2)
temp_xml <- read_xml(temp_response)
class(temp_xml)
## [1] "xml_document" "xml_node"

Strukturen ser man enklast genom att öppna

https://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/97200/period/latest-day/data.xml

i web-browsern. Vi ser att temperaturerna ligger i XPATH "/metObsSampleData/value/value":

xml_ns_strip(temp_xml) # Överkurs
xml_find_all(temp_xml, "/metObsSampleData/value/value")
## {xml_nodeset (25)}
##  [1] <value>-6.8</value>
##  [2] <value>-6.4</value>
##  [3] <value>-5.8</value>
##  [4] <value>-5.0</value>
##  [5] <value>-4.5</value>
##  [6] <value>-4.0</value>
##  [7] <value>-3.4</value>
##  [8] <value>-3.2</value>
##  [9] <value>-3.0</value>
## [10] <value>-3.2</value>
## [11] <value>-3.1</value>
## [12] <value>-3.0</value>
## [13] <value>-2.8</value>
## [14] <value>-4.8</value>
## [15] <value>-5.4</value>
## [16] <value>-8.1</value>
## [17] <value>-7.6</value>
## [18] <value>-5.7</value>
## [19] <value>-6.5</value>
## [20] <value>-5.1</value>
## ...
  • Ta även fram tidpunkterna.
  • Välj ut och ta fram någon annan parameter/station (se SMHI). Prova även JSON-formatet.

Systembolag

Systembolagets API använder XML, sortimentsfilen ser dock ut att vara i fel format. Istället kan vi hämta butikslistan med

butiker_response <- GET("https://www.systembolaget.se/api/assortment/stores/xml")
http_type(butiker_response)
## [1] "application/xml"

Vi konverterar till XML-fomat med

butiker_xml <- read_xml(butiker_response)

och tittar på första butiken med

xml_find_first(butiker_xml, "/ButikerOmbud/ButikOmbud")
## {xml_node}
## <ButikOmbud type="StoreAssortmentViewModel">
##  [1] <Typ>Butik</Typ>
##  [2] <Nr>0102</Nr>
##  [3] <Namn>Fältöversten</Namn>
##  [4] <Address1>Karlaplan 13</Address1>
##  [5] <Address2/>
##  [6] <Address3>115 20</Address3>
##  [7] <Address4>STOCKHOLM</Address4>
##  [8] <Address5>Stockholms län</Address5>
##  [9] <Telefon>08/662 22 89</Telefon>
## [10] <ButiksTyp/>
## [11] <Tjanster/>
## [12] <SokOrd>STOCKHOLM;STHLM;ÖSTERMALM;KARLAPLANSRONDELLEN;FÄLTAN</SokOrd>
## [13] <Oppettider>2018-02-08;10:00;19:00;;;0;_*2018-02-09;10:00;19:00;;;0 ...
## [14] <RT90x>6582011</RT90x>
## [15] <RT90y>1630064</RT90y>

För att få ut t.ex. butiksnamnen använder vi nu

xml_find_all(butiker_xml, "//Namn")[1:10]
## {xml_nodeset (10)}
##  [1] <Namn>Fältöversten</Namn>
##  [2] <Namn/>
##  [3] <Namn>Garnisonen</Namn>
##  [4] <Namn/>
##  [5] <Namn>Sergel</Namn>
##  [6] <Namn>PK-Huset</Namn>
##  [7] <Namn/>
##  [8] <Namn>Marieberg</Namn>
##  [9] <Namn/>
## [10] <Namn/>

uppenbarligen har inte alla butiker ett namn.

  • Hur många butiker finns i respektive län?