README.md

rjsonapi

Build Status codecov.io

An R client for consuming APIs that follow the JSONAPI spec. This library does not do server side JSONAPI things.

Setup a JSONAPI

Which starts a server. Then point your browser to e.g.:

Install rjsonapi R client

Stabler version

install.packages("rjsonapi")

Dev version

devtools::install_github("ropensci/rjsonapi")
library("rjsonapi")

Connect

(conn <- jsonapi_connect("http://localhost:8088/v1"))
#> <jsonapi_connection>
#>   Public:
#>     base_url: function () 
#>     cli: HttpClient, R6
#>     content_type: application/vnd.api+json
#>     headers: NULL
#>     initialize: function (url, version, content_type, headers = list(), ...) 
#>     opts: list
#>     route: function (endpt, query = NULL, include = NULL, error_handler = private$check, 
#>     routes: function (...) 
#>     status: function (...) 
#>     url: http://localhost:8088/v1
#>     version: v1
#>   Private:
#>     check: function (x, ...) 
#>     fromjson: function (...)

Get API info

Get version

conn$version
#> [1] "v1"

Get base URL

conn$base_url()
#> [1] "http://localhost:8088/v1"

Get server status

conn$status()
#> [1] "OK (200)"

Get routes (not available in a standard JSONAPI i think)

conn$routes()
#> $authors
#> [1] "/v1/authors?include={books,books.chapters,photos}&filter[{id,name,alive,dead,date_of_birth,date_of_death,born_before,born_after}]"
#> 
#> $books
#> [1] "/v1/books?include={chapters,firstChapter,series,author,stores,photos}&filter[{author_id,series_id,date_published,published_before,published_after,title}]"
#> 
#> $chapters
#> [1] "/v1/chapters?include={book}&filter[{book_id,title,ordering}]"
#> 
#> $photos
#> [1] "/v1/photos?include={imageable}"
#> 
#> $series
#> [1] "/v1/series?include={books,photos}&filter[{title}]"
#> 
#> $stores
#> [1] "/v1/stores?include={books,books.author}"

Call a route

books route

conn$route("authors")
#> $data
#>   id    type  attributes.name attributes.date_of_birth
#> 1  1 authors J. R. R. Tolkien               1892-01-03
#> 2  2 authors    J. K. Rowling               1965-07-31
#>   attributes.date_of_death attributes.created_at attributes.updated_at
#> 1               1973-09-02   2017-01-07 18:16:44   2017-01-07 18:16:44
#> 2                     <NA>   2017-01-07 18:16:44   2017-01-07 18:16:44
#>      relationships.books.links.self relationships.books.links.related
#> 1 /v1/authors/1/relationships/books               /v1/authors/1/books
#> 2 /v1/authors/2/relationships/books               /v1/authors/2/books
#>      relationships.photos.links.self relationships.photos.links.related
#> 1 /v1/authors/1/relationships/photos               /v1/authors/1/photos
#> 2 /v1/authors/2/relationships/photos               /v1/authors/2/photos
#>            self
#> 1 /v1/authors/1
#> 2 /v1/authors/2

Get a single document

First authors document

conn$route("authors/1")
#> $data
#> $data$id
#> [1] "1"
#> 
#> $data$type
#> [1] "authors"
#> 
#> $data$attributes
#> $data$attributes$name
#> [1] "J. R. R. Tolkien"
#> 
#> $data$attributes$date_of_birth
#> [1] "1892-01-03"
#> 
#> $data$attributes$date_of_death
#> [1] "1973-09-02"
#> 
#> $data$attributes$created_at
#> [1] "2017-01-07 18:16:44"
#> 
#> $data$attributes$updated_at
#> [1] "2017-01-07 18:16:44"
#> 
#> 
#> $data$relationships
#> $data$relationships$books
#> $data$relationships$books$links
#> $data$relationships$books$links$self
#> [1] "/v1/authors/1/relationships/books"
#> 
#> $data$relationships$books$links$related
#> [1] "/v1/authors/1/books"
#> 
#> 
#> 
#> $data$relationships$photos
#> $data$relationships$photos$links
#> $data$relationships$photos$links$self
#> [1] "/v1/authors/1/relationships/photos"
#> 
#> $data$relationships$photos$links$related
#> [1] "/v1/authors/1/photos"
#> 
#> 
#> 
#> 
#> $data$links
#> $data$links$self
#> [1] "/v1/authors/1"

Sub-part under that document: books

conn$route("authors/1/books")
#> $data
#>   id  type attributes.date_published           attributes.title
#> 1  1 books                1954-07-29 The Fellowship of the Ring
#> 2  2 books                1954-11-11             The Two Towers
#> 3  3 books                1955-10-20         Return of the King
#> 4 11 books                1937-09-21                 The Hobbit
#>   attributes.created_at attributes.updated_at
#> 1   2017-01-07 18:16:44   2017-01-07 18:16:44
#> 2   2017-01-07 18:16:44   2017-01-07 18:16:44
#> 3   2017-01-07 18:16:44   2017-01-07 18:16:44
#> 4   2017-01-07 18:16:44   2017-01-07 18:16:44
#>       relationships.chapters.links.self
#> 1  /v1/authors/1/relationships/chapters
#> 2  /v1/authors/2/relationships/chapters
#> 3  /v1/authors/3/relationships/chapters
#> 4 /v1/authors/11/relationships/chapters
#>   relationships.chapters.links.related
#> 1               /v1/authors/1/chapters
#> 2               /v1/authors/2/chapters
#> 3               /v1/authors/3/chapters
#> 4              /v1/authors/11/chapters
#>       relationships.firstChapter.links.self
#> 1  /v1/authors/1/relationships/firstChapter
#> 2  /v1/authors/2/relationships/firstChapter
#> 3  /v1/authors/3/relationships/firstChapter
#> 4 /v1/authors/11/relationships/firstChapter
#>   relationships.firstChapter.links.related
#> 1               /v1/authors/1/firstChapter
#> 2               /v1/authors/2/firstChapter
#> 3               /v1/authors/3/firstChapter
#> 4              /v1/authors/11/firstChapter
#>       relationships.series.links.self relationships.series.links.related
#> 1  /v1/authors/1/relationships/series               /v1/authors/1/series
#> 2  /v1/authors/2/relationships/series               /v1/authors/2/series
#> 3  /v1/authors/3/relationships/series               /v1/authors/3/series
#> 4 /v1/authors/11/relationships/series              /v1/authors/11/series
#>   relationships.series.data.id relationships.series.data.type
#> 1                            1                         series
#> 2                            1                         series
#> 3                            1                         series
#> 4                         <NA>                           <NA>
#>       relationships.author.links.self relationships.author.links.related
#> 1  /v1/authors/1/relationships/author               /v1/authors/1/author
#> 2  /v1/authors/2/relationships/author               /v1/authors/2/author
#> 3  /v1/authors/3/relationships/author               /v1/authors/3/author
#> 4 /v1/authors/11/relationships/author              /v1/authors/11/author
#>   relationships.author.data.id relationships.author.data.type
#> 1                            1                        authors
#> 2                            1                        authors
#> 3                            1                        authors
#> 4                            1                        authors
#>       relationships.stores.links.self relationships.stores.links.related
#> 1  /v1/authors/1/relationships/stores               /v1/authors/1/stores
#> 2  /v1/authors/2/relationships/stores               /v1/authors/2/stores
#> 3  /v1/authors/3/relationships/stores               /v1/authors/3/stores
#> 4 /v1/authors/11/relationships/stores              /v1/authors/11/stores
#>       relationships.photos.links.self relationships.photos.links.related
#> 1  /v1/authors/1/relationships/photos               /v1/authors/1/photos
#> 2  /v1/authors/2/relationships/photos               /v1/authors/2/photos
#> 3  /v1/authors/3/relationships/photos               /v1/authors/3/photos
#> 4 /v1/authors/11/relationships/photos              /v1/authors/11/photos
#>             self
#> 1  /v1/authors/1
#> 2  /v1/authors/2
#> 3  /v1/authors/3
#> 4 /v1/authors/11

A different sub-part under that document: photos

conn$route("authors/1/photos")
#> $data
#>   id   type attributes.imageable_id attributes.imageable_type
#> 1  1 photos                       1                   authors
#> 2  2 photos                       1                   authors
#>                      attributes.title
#> 1                    J. R. R. Tolkein
#> 2 Family Postcard of J. R. R. Tolkein
#>                                                                         attributes.uri
#> 1                  http://upload.wikimedia.org/wikipedia/commons/b/b4/Tolkien_1916.jpg
#> 2 http://upload.wikimedia.org/wikipedia/commons/5/5b/Mabel_Suffield_Christmas_Card.jpg
#>   attributes.created_at attributes.updated_at
#> 1   2017-01-07 18:16:44   2017-01-07 18:16:44
#> 2   2017-01-07 18:16:44   2017-01-07 18:16:44
#>      relationships.imageable.links.self
#> 1 /v1/authors/1/relationships/imageable
#> 2 /v1/authors/2/relationships/imageable
#>   relationships.imageable.links.related          self
#> 1               /v1/authors/1/imageable /v1/authors/1
#> 2               /v1/authors/2/imageable /v1/authors/2

Experimental - startup a server from R

In one R session:

jsonapi_server()
#> Starting server to listen on port 8000

Then in another R session:

Connect to the server:

(conn <- jsonapi_connect("http://localhost:8000"))

Get routes

conn$routes()

Get chapters

conn$route("chapters")

Note: This server stuff is still in infancy. Working on getting a more complete set of routes and data.

Right now, jsonapi_server() only loads data that comes with this package - in the future it will support your own data.

Meta

rofooter



Try the rjsonapi package in your browser

Any scripts or data that you put into this service are public.

rjsonapi documentation built on May 2, 2019, 11:12 a.m.