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

http://github.com/msusur


Twitter

http://twitter.com/mertsusur

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