Lös kapitlen Downloading Files and Using API Clients, Using httr to interact with APIs directly och Handling JSON and XML på DataCamp.
Läs: Kapitel 1-3 i An introduction to APIs
Resurser:
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.
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
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 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
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>
## ...
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.