LARAVEL PHP SERVER SIDE RESTFUL
API BEST PRACTICES
Name: Vu Quang Son
SERVER SIDE
2016
1
Table of content
2
 Versioning
 Routing
 Filter, sort, search, paging
 Json format
 HTTP Status Code
 Other best practices
Versioning
 /api/v1
 /public/api/v1/apps
3
Versioning (Best Practices)
 API Version is always required
 Use simple number (1, 2, …) & avoid dot such as 2.5
 Versioning starting with the letter “v”
4
Routing
5
Routing (cont)
1. GET /answers - Retrieves a list of answers
2. GET /answers/12 - Retrieves a specific answer
3. POST /answers - Creates a new answers
4. PUT /answers/12 - Updates answer #12
5. DELETE /answers/12 - Deletes answer #12
6
Implement Routing
7
Routing
(Advantages & Best Practices)
 Apply existing HTTP Methods to implement multiple
functions on just single /answers endpoint
 No naming conventions to follow and URL is clean &
clear
 Use nouns not verbs
 Use only plural nouns
8
Routing
(Discussion)
 How about custom routes?
 GET /apps/filter
 GET /apps/related
 How about routes with multiple words
 Use dashes ( - ) for words delimiter
 Deal with multiple objects
 POST /answers/create
 PUT /answers/edit
 DELETE /answers/remove 9
Routing
(Discussion)
 Deal with relations?
 GET /apps/12/questions
 GET /questions?app_id=12
 GET /apps/12/questions/14/medias
 GET /medias?app_id=12&question_id=14
10
FILTER, SORT, SEARCH, PAGING
11
 FILTER
 Use unique query parameter for each field that
implements filtering
 Use database fields for faster implementation
 GET /apps?status=draft
 GET /apps?status=published&featured=1
FILTER, SORT, SEARCH, PAGING
12
 FILTER (Discussion & Improvement)
 The best if can also filter with most used parameters
 &gt, &lt, &gte, &lte, …
 GET /apps?rating[value]=2&rating[operator]="&gte“
 GET /apps?price[value]=0&price[operator]="&gt“
 GET /apps?has_price=1
FILTER, SORT, SEARCH, PAGING
13
 SORT
 Defined constant sort
 Parameters delimiter by comma (,)
 -created_at for DESC
 create_at for ASC
 GET /apps?sort=-created_at,id
FILTER, SORT, SEARCH, PAGING
14
 SEARCH
 Defined constant search (search or q?)
 GET /apps?search=“IBM test”
 GET /apps?q=“IBM test”
FILTER, SORT, SEARCH, PAGING
15
 SEARCH (Discussion & Improvement)
 search or q keyword?
 GET /apps?search=“IBM test”
 GET /apps?q=“IBM test”
 GET /apps?q[value]=“IBM”&q[field]=“title”
FILTER, SORT, SEARCH, PAGING
16
 PAGING
 Defined constant limit and offset
 Default limit = 10 & offset = 0
 /apps?limit=20&offset=10
 Want no limit?
 /apps?limit=
 /apps?limit=0
FILTER, SORT, SEARCH, PAGING
17
 PAGING
 Defined constant limit and offset
 Default limit = 10 & offset = 0
 /apps?limit=20&offset=10
 Want no limit?
 /apps?limit=
 /apps?limit=0
FILTER, SORT, SEARCH, PAGING
18
 Limit fields returned by API
 Defined constant fields
 GET /apps?fields=id,title,created_at
JSON FORMAT (Success)
19
{
"errorCode": null,
"message": null,
"result": [ ]
}
{
"errorCode": null,
"message": null,
"result": { }
}
JSON FORMAT (Error)
20
{
"errorCode": "validation_error",
"message": [
“The selected icon is invalid.”,
“The icon is invalid or in used”
],
"result": null
}
JSON FORMAT (Error)
21
{
"errorCode": "validation_error",
"message": {
"icon": [
"The selected icon is invalid."
],
"background": [
"The selected background is invalid."
]
},
"result": null
}
AVOID BAD PRACTICE
22
{
"errorCode": "validation_error",
"message": null,
"result": [
1: { },
2: { }
]
}
HTTP STATUS CODE
23
 200 OK – successful GET, PUT, DELETE
 201 Created – successful POST in creation
 204 No Content – successful request like DELETE
 304 Not Modified – for caching
 400 Bad Request – malformed request, cannot parse
 401 Unauthorized – invalid authentication
 403 Forbidden – do not have access
 404 Not Found – resource doesn’t exist
 405 Method Not Allowed – not implemented/not allow
 412 Precondition Failed – validation header
 422 Unprocessable Entity – validation body
 429 Too Many Requests – reject due to rate limit
 500 Internal Server Error – server error
HTTP STATUS CODE
(Discussion & Improvement)
24
 Using 201 Created – for successful POST in creation
instead of 200 OK
 Using 422 Unprocessable Entity – for validation error
instead of 412 Precondition Failed
OTHER BEST PRACTICES
25
 Using json only for response
OTHER BEST PRACTICES
26
 Always enable Gzip for api
 Handle Cors (Coss-Origin Resource Sharing)
 Allow overriding HTTP method (X-HTTP-Method-
Override)
REFERENCE
27
 http://www.vinaysahni.com/best-practices-for-a-
pragmatic-restful-api
 https://laravel.com/docs/5.3/controllers
 http://blog.mwaysolutions.com/2014/06/05/10-
best-practices-for-better-restful-api/
 https://github.com/FriendsOfCake/crud/issues/337
 https://saipraveenblog.wordpress.com/2014/09/29/
rest-api-best-practices/
Q & A
28
2929

PHP Server side restful API - linkedin

  • 1.
    LARAVEL PHP SERVERSIDE RESTFUL API BEST PRACTICES Name: Vu Quang Son SERVER SIDE 2016 1
  • 2.
    Table of content 2 Versioning  Routing  Filter, sort, search, paging  Json format  HTTP Status Code  Other best practices
  • 3.
  • 4.
    Versioning (Best Practices) API Version is always required  Use simple number (1, 2, …) & avoid dot such as 2.5  Versioning starting with the letter “v” 4
  • 5.
  • 6.
    Routing (cont) 1. GET/answers - Retrieves a list of answers 2. GET /answers/12 - Retrieves a specific answer 3. POST /answers - Creates a new answers 4. PUT /answers/12 - Updates answer #12 5. DELETE /answers/12 - Deletes answer #12 6
  • 7.
  • 8.
    Routing (Advantages & BestPractices)  Apply existing HTTP Methods to implement multiple functions on just single /answers endpoint  No naming conventions to follow and URL is clean & clear  Use nouns not verbs  Use only plural nouns 8
  • 9.
    Routing (Discussion)  How aboutcustom routes?  GET /apps/filter  GET /apps/related  How about routes with multiple words  Use dashes ( - ) for words delimiter  Deal with multiple objects  POST /answers/create  PUT /answers/edit  DELETE /answers/remove 9
  • 10.
    Routing (Discussion)  Deal withrelations?  GET /apps/12/questions  GET /questions?app_id=12  GET /apps/12/questions/14/medias  GET /medias?app_id=12&question_id=14 10
  • 11.
    FILTER, SORT, SEARCH,PAGING 11  FILTER  Use unique query parameter for each field that implements filtering  Use database fields for faster implementation  GET /apps?status=draft  GET /apps?status=published&featured=1
  • 12.
    FILTER, SORT, SEARCH,PAGING 12  FILTER (Discussion & Improvement)  The best if can also filter with most used parameters  &gt, &lt, &gte, &lte, …  GET /apps?rating[value]=2&rating[operator]="&gte“  GET /apps?price[value]=0&price[operator]="&gt“  GET /apps?has_price=1
  • 13.
    FILTER, SORT, SEARCH,PAGING 13  SORT  Defined constant sort  Parameters delimiter by comma (,)  -created_at for DESC  create_at for ASC  GET /apps?sort=-created_at,id
  • 14.
    FILTER, SORT, SEARCH,PAGING 14  SEARCH  Defined constant search (search or q?)  GET /apps?search=“IBM test”  GET /apps?q=“IBM test”
  • 15.
    FILTER, SORT, SEARCH,PAGING 15  SEARCH (Discussion & Improvement)  search or q keyword?  GET /apps?search=“IBM test”  GET /apps?q=“IBM test”  GET /apps?q[value]=“IBM”&q[field]=“title”
  • 16.
    FILTER, SORT, SEARCH,PAGING 16  PAGING  Defined constant limit and offset  Default limit = 10 & offset = 0  /apps?limit=20&offset=10  Want no limit?  /apps?limit=  /apps?limit=0
  • 17.
    FILTER, SORT, SEARCH,PAGING 17  PAGING  Defined constant limit and offset  Default limit = 10 & offset = 0  /apps?limit=20&offset=10  Want no limit?  /apps?limit=  /apps?limit=0
  • 18.
    FILTER, SORT, SEARCH,PAGING 18  Limit fields returned by API  Defined constant fields  GET /apps?fields=id,title,created_at
  • 19.
    JSON FORMAT (Success) 19 { "errorCode":null, "message": null, "result": [ ] } { "errorCode": null, "message": null, "result": { } }
  • 20.
    JSON FORMAT (Error) 20 { "errorCode":"validation_error", "message": [ “The selected icon is invalid.”, “The icon is invalid or in used” ], "result": null }
  • 21.
    JSON FORMAT (Error) 21 { "errorCode":"validation_error", "message": { "icon": [ "The selected icon is invalid." ], "background": [ "The selected background is invalid." ] }, "result": null }
  • 22.
    AVOID BAD PRACTICE 22 { "errorCode":"validation_error", "message": null, "result": [ 1: { }, 2: { } ] }
  • 23.
    HTTP STATUS CODE 23 200 OK – successful GET, PUT, DELETE  201 Created – successful POST in creation  204 No Content – successful request like DELETE  304 Not Modified – for caching  400 Bad Request – malformed request, cannot parse  401 Unauthorized – invalid authentication  403 Forbidden – do not have access  404 Not Found – resource doesn’t exist  405 Method Not Allowed – not implemented/not allow  412 Precondition Failed – validation header  422 Unprocessable Entity – validation body  429 Too Many Requests – reject due to rate limit  500 Internal Server Error – server error
  • 24.
    HTTP STATUS CODE (Discussion& Improvement) 24  Using 201 Created – for successful POST in creation instead of 200 OK  Using 422 Unprocessable Entity – for validation error instead of 412 Precondition Failed
  • 25.
    OTHER BEST PRACTICES 25 Using json only for response
  • 26.
    OTHER BEST PRACTICES 26 Always enable Gzip for api  Handle Cors (Coss-Origin Resource Sharing)  Allow overriding HTTP method (X-HTTP-Method- Override)
  • 27.
    REFERENCE 27  http://www.vinaysahni.com/best-practices-for-a- pragmatic-restful-api  https://laravel.com/docs/5.3/controllers http://blog.mwaysolutions.com/2014/06/05/10- best-practices-for-better-restful-api/  https://github.com/FriendsOfCake/crud/issues/337  https://saipraveenblog.wordpress.com/2014/09/29/ rest-api-best-practices/
  • 28.
  • 29.

Editor's Notes

  • #13 https://www.drupal.org/project/restful_search_api
  • #24 https://github.com/FriendsOfCake/crud/issues/337
  • #25 https://github.com/FriendsOfCake/crud/issues/337