Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JSON API
Search
Marco Otte-Witte
November 13, 2015
Technology
1
1.9k
JSON API
Introduction to JSON API - a talk I gave at RubyDay 2015.
Marco Otte-Witte
November 13, 2015
Tweet
Share
More Decks by Marco Otte-Witte
See All by Marco Otte-Witte
Securing Technology Investments
marcoow
0
110
Handling images on the web
marcoow
0
390
SSR, SPAs and PWAs
marcoow
0
350
Fast, Fast, Fast
marcoow
2
460
Feel the Glimmer - ParisJS
marcoow
1
490
Feel the Glimmer - MunichJS 11/17
marcoow
0
130
The JSON:API spec
marcoow
3
1.7k
Leveraging the complete Ember Toolbelt
marcoow
0
330
Feel the Glimmer
marcoow
1
230
Other Decks in Technology
See All in Technology
生成AIと知識グラフの相互利用に基づく文書解析
koujikozaki
1
140
LeSSに潜む「隠れWF病」とその処方箋
lycorptech_jp
PRO
2
120
使えそうで使われないCloudHSM
maikamibayashi
0
170
ガバメントクラウド先行事業中間報告を読み解く
sugiim
1
1.4k
いまならこう作りたい AWSコンテナ[本格]入門ハンズオン 〜2024年版 ハンズオンの構想〜
horsewin
9
2.1k
GitHub Universe: Evaluating RAG apps in GitHub Actions
pamelafox
0
180
バクラクにおける可観測性向上の取り組み
yuu26
3
420
カメラを用いた店内計測におけるオプトインの仕組みの実現 / ai-optin-camera
cyberagentdevelopers
PRO
1
120
マネジメント視点でのre:Invent参加 ~もしCEOがre:Inventに行ったら~
kojiasai
0
470
ネット広告に未来はあるか?「3rd Party Cookie廃止とPrivacy Sandboxの効果検証の裏側」 / third-party-cookie-privacy
cyberagentdevelopers
PRO
1
130
MAMを軸とした動画ハンドリングにおけるAI活用前提の整備と次世代ビジョン / abema-ai-mam
cyberagentdevelopers
PRO
1
120
pandasはPolarsに性能面で追いつき追い越せるのか
vaaaaanquish
4
4.6k
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
What's in a price? How to price your products and services
michaelherold
243
12k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
231
17k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
4 Signs Your Business is Dying
shpigford
180
21k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
504
140k
It's Worth the Effort
3n
183
27k
Fontdeck: Realign not Redesign
paulrobertlloyd
81
5.2k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Unsuck your backbone
ammeep
668
57k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
3
370
The World Runs on Bad Software
bkeepers
PRO
65
11k
Transcript
None
Marco Otte-Witte @marcoow
http://simplabs.com @simplabs
None
http://jsonapi.org
A specification for building APIs in JSON
None
“ “ “ “
“ “ “ “
Why is this even needed?
https://twitter.com/thomasfuchs/status/604323589979049984
everybody is using RESTful JSON APIs already
…but they are all different
GET /repos/sinatra/sinatra { "id": 1, "name": "sinatra", … }
GET /repos/sinatra/sinatra { "repo": { "id": 82, "name": "sinatra/sinatra", …
} }
GET /1.1/users/show.json? screen_name=marcoow { "id": 1, "name": "marcoow", … }
GET /users/marcoow { "id": 1, "login": "marcoow", … }
GET /repos/simplabs/rails_api_auth { "id": 1, "name": "rails_api_auth", "owner": { "id":
1, "name": "simplabs", … } … }
GET /repos/:repo_id/branches/master { "branches": { { "id": 1, "repository_id": 891,
… } } }
https://www.broxap.com/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/b/i/bikeshed_bxmwmu2.jpg_1.jpg.jpg
JSON API is your anti bikeshedding weapon
some History
it started with a lengthy discussion between Yehuda Katz and
Steve Klabnik at RailsConf 2013
Yehuda wrote the first draft
1.0 released on May 29th 2015
None
the Goals
define a generic media type that works across a broad
set of use cases
make the format similar to existing server-side framework practices
having a human readable format that is also easy to
debug
ensuring ease of implementation both on the server as well
as on the client side
the Format
Media Type application/vnd.api+json http://www.iana.org/assignments/media-types/application/vnd.api+json
Resource Objects represent individual resources
GET /articles/1 { "data": { "type": "articles", "id": "1", "attributes":
{ "title": "JSON API paints my bikeshed!" } } }
GET /articles { "data": [ { "type": "articles", "id": "1",
"attributes": { "title": "JSON API paints my bikeshed!" } }, { "type": "articles", "id": "2", "attributes": { "title": "Rails is Omakase" } } ] }
GET /articles/1 { "data": { "type": "articles", "id": "1", "attributes":
{ "title": "JSON API paints my bikeshed!" }, "relationships": { "author": { "data": { "type": "people", "id": "1" } } } } }
Hypermedia is part of the spec but opt-in
GET /articles/1 { "data": { "type": "articles", "id": "1", "attributes":
{ "title": "JSON API paints my bikeshed!" }, "relationships": { "author": { "links": { "self": "/articles/1/relationships/author", "related": "/articles/1/author" } } } } }
Inclusion of related resources is a way of reducing requests
GET /articles/1 { "data": { "type": "articles", "id": "1", "attributes":
{ "title": "JSON API paints my bikeshed!" }, "relationships": { "author": { "data": { "type": "people", "id": "1" } } } }, "included": [{ "type": "people", "id": "1", "attributes": { "name": "Dan Gebhard" } }] }
CRUD works pretty much as you'd expect
GET /articles GET /articles/1 POST /articles PATCH /articles/1 DELETE /articles/1
POST /articles { "data": { "type": "articles", "attributes": { "title":
"JSON API paints my bikeshed!" } } }
HTTP/1.1 201 Created Location: http://example.com/articles/1 { "data": { "type": "articles",
"id": "1", "attributes": { "title": "JSON API paints my bikeshed!" } } }
PATCH /articles/1 { "data": { "type": "articles", "id": "1", "attributes":
{ "title": "json:api paints my bikeshed!" } } }
HTTP/1.1 204 No Content
DELETE /articles/1
HTTP/1.1 204 No Content
Advanced Features
Inclusion of related resources can also be requested by the
client
GET /articles/1?include=comments.author
Sparse field sets can be used to reduce the response
size
GET /articles? include=author&fields[articles]=title,body&fi elds[people]=name
Bulk Operations allow creating/updating/deleting multiple resources at once
POST /articles { "data": [{ "type": "articles", "attributes": { "title":
"JSON API paints my bikeshed!" } }, { "type": "articles", "attributes": { "title": "Rails is Omakase" } }] }
HTTP/1.1 201 Created { "data": [{ "type": "articles", "id": "1",
"attributes": { "title": "JSON API paints my bikeshed!" } },{ "type": "articles", "id": "2", "attributes": { "title": "Rails is Omakase" } }] }
Ruby Implementations
ActiveModelSerializers supports it in 0.10.0 https://github.com/rails-api/active_model_serializers
ROAR https://github.com/apotonick/roar
JSONAPI::Resources https://github.com/cerebris/jsonapi-resources
Client Libraries are available for many languages http://jsonapi.org/implementations/
None
♥
http://simplabs.com @simplabs