What's wrong with REST?
Mert Susur
https://twitter.com/mertsusur
WHO?
Senior Engineer @ Wonga
Weekly Podcast with Codefiction
http://soundcloud.com/codefiction
Yet another tutorial guy in Youtube
http://youtube.com/codefiction
Open source stuff
Twitter
Let's do some REST
/customers/22/
/customers/22/products
/customers/22/products/34
/customers/22/products/34/orders
/customers/22/products/34/orders/1
GET /customers/22/
GET /customers/22/products
GET /customerswithproducts/22
OR
Nested relationships
What about versioning?
HTTP GET:
https://mysite.com/api/v4/customers
OR
HTTP GET:
https://mysite.com/api/customers
api-version: 4
OR
HTTP GET:
https://mysite.com/api/customers
Accept: application/vnd.mysite.v4+json
{
"text": "RT @PostGradProblem: In preparation for the NFL lockout, I will be spending twice as much time analyzing my fantasy baseball team during ...",
"truncated": true,
"in_reply_to_user_id": null,
"in_reply_to_status_id": null,
"favorited": false,
"source": "<a href=\"http://twitter.com/\" rel=\"nofollow\">Twitter for iPhone</a>",
"in_reply_to_screen_name": null,
"in_reply_to_status_id_str": null,
"id_str": "54691802283900928",
"entities": {
"user_mentions": [
{
"indices": [
3,
19
],
"screen_name": "PostGradProblem",
"id_str": "271572434",
"name": "PostGradProblems",
"id": 271572434
}
],
"urls": [ ],
"hashtags": [ ]
},
"contributors": null,
"retweeted": false,
"in_reply_to_user_id_str": null,
"place": null,
"retweet_count": 4,
"created_at": "Sun Apr 03 23:48:36 +0000 2011",
"retweeted_status": {
"text": "In preparation for the NFL lockout, I will be spending twice as much time analyzing my fantasy baseball team during company time. #PGP",
"truncated": false,
"in_reply_to_user_id": null,
"in_reply_to_status_id": null,
"favorited": false,
"source": "<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>",
"in_reply_to_screen_name": null,
"in_reply_to_status_id_str": null,
"id_str": "54640519019642881",
"entities": {
"user_mentions": [ ],
"urls": [ ],
"hashtags": [
{
"text": "PGP",
"indices": [
130,
134
]
}
]
},
"contributors": null,
"retweeted": false,
"in_reply_to_user_id_str": null,
"place": null,
"retweet_count": 4,
"created_at": "Sun Apr 03 20:24:49 +0000 2011",
"user": {
"notifications": null,
"profile_use_background_image": true,
"statuses_count": 31,
"profile_background_color": "C0DEED",
"followers_count": 3066,
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"listed_count": 6,
"profile_background_image_url": "http://a3.twimg.com/a/1301071706/images/themes/theme1/bg.png",
"description": "",
"screen_name": "PostGradProblem",
"default_profile": true,
"verified": false,
"time_zone": null,
"profile_text_color": "333333",
"is_translator": false,
"profile_sidebar_fill_color": "DDEEF6",
"location": "",
"id_str": "271572434",
"default_profile_image": false,
"profile_background_tile": false,
"lang": "en",
"friends_count": 21,
"protected": false,
"favourites_count": 0,
"created_at": "Thu Mar 24 19:45:44 +0000 2011",
"profile_link_color": "0084B4",
"name": "PostGradProblems",
"show_all_inline_media": false,
"follow_request_sent": null,
"geo_enabled": false,
"profile_sidebar_border_color": "C0DEED",
"url": null,
"id": 271572434,
"contributors_enabled": false,
"following": null,
"utc_offset": null
},
"id": 54640519019642880,
"coordinates": null,
"geo": null
},
"user": {
"notifications": null,
"profile_use_background_image": true,
"statuses_count": 351,
"profile_background_color": "C0DEED",
"followers_count": 48,
"profile_image_url": "http://a1.twimg.com/profile_images/455128973/gCsVUnofNqqyd6tdOGevROvko1_500_normal.jpg",
"listed_count": 0,
"profile_background_image_url": "http://a3.twimg.com/a/1300479984/images/themes/theme1/bg.png",
"description": "watcha doin in my waters?",
"screen_name": "OldGREG85",
"default_profile": true,
"verified": false,
"time_zone": "Hawaii",
"profile_text_color": "333333",
"is_translator": false,
"profile_sidebar_fill_color": "DDEEF6",
"location": "Texas",
"id_str": "80177619",
"default_profile_image": false,
"profile_background_tile": false,
"lang": "en",
"friends_count": 81,
"protected": false,
"favourites_count": 0,
"created_at": "Tue Oct 06 01:13:17 +0000 2009",
"profile_link_color": "0084B4",
"name": "GG",
"show_all_inline_media": false,
"follow_request_sent": null,
"geo_enabled": false,
"profile_sidebar_border_color": "C0DEED",
"url": null,
"id": 80177619,
"contributors_enabled": false,
"following": null,
"utc_offset": -36000
},
"id": 54691802283900930,
"coordinates": null,
"geo": null
}
We have another option!
What is GraphQL?
Strong-typing
Hierarchical
Client-specified queries
Product-centric
Introspective
Check for details Graphql overview
Timeline
Facebook created GraphQL to support native apps
2012
Open sourced Graphql.js
2015
Github announced GraphQL API's
2016
Who's using it?
Source: @Jonas Helfer
Query Language
&
Schema
Query Language
{
user(id:"6517f9c4-5f1b-4327-a9c4-b3df60c17785") {
id,
name,
email
}
}
{
"data": {
"user": {
"id": "6517f9c4-5f1b-4327-a9c4-b3df60c17785",
"name": "John",
"email": "john@doe.com"
}
}
}
Query Language
Nested Queries
{
user(id:"6517f9c4-5f1b-4327-a9c4-b3df60c17785") {
id,
name,
addresses{
city,
details
}
}
}
{
"data": {
"user": {
"id": "6517f9c4-5f1b-4327-a9c4-b3df60c17785",
"name": "John",
"addresses": [
{
"city": "London",
"details": "N12"
},
{
"city": "London",
"details": "SE2"
}
]
}
}
}
Schema
Int, Float, String,Boolean, ID, Enum, Lists
type User {
id: ID!
name: String!
email: String!
password: String!
addresses: [ Address ]
}
Mutations
createUser(user: $user, address: $address) {
id
name
email
addresses {
id
details
city
}
}
DEMO
What's wrong with REST?
By Mert Susur
What's wrong with REST?
- 1,102