RESTful API Design Best Practices

restful api design best practices

In order to design great RESTful APIs, we should follow the best practices or guidelines to implement and maintain them effectively. Today, we would like to share the following best practices:

General concepts

  • KISS: Anyone should be able to use the API without having to refer to the documentation.
    • Use standard, concrete and shared terms, not the specific business terms or acronyms.
    • Never allow application developers to do things in more than one way.
    • Design your API for clients (application  developers), not for data.
    • Target major use cases first, deal with exceptions later.
  • CURL: using CURL to share examples, which can be easily copy/paste.
  • Resources shouldn’t be nested more than two level deep : GET /ads/id
  • Considering the following five subdomains:
    • Production:  – https://api.mycompany.com
    • Tests – https://api.sandbox.mycompany.com
    • Developer portal – https://developers.mycompany.com
    • Production with security – https://oauth2.mycompany.com
    • Tests – https://oauth2.sandbox.mycompany.com
  • Security : OAuth2 & HTTPS
    • Using OAuth2 to manage Authorization
    • Using HTTPS for every API/OAuth2 request.
  1. Use json to send/receive data

The benefits from using JSON described as below:

  • it’s easier to use, write and read
  • it’s faster and consumes less memory space
  • it doesn’t need special dependencies or packages to parse it
  • every single meaningful programming language has great support for it
  1. Use nouns instead of verb for resources

So let’s start with API endpoints. The rules here are simple:

  • use nouns instead of verbs
  • use plural instead of singular

Regarding endpoint naming: try to use single words instead of multi words. If you really have to use multi words then use hyphens between them. Using all lowercase letters in URIs. My idea: I would recommend using snake_case. I find snake_case much easier to read and that is why all of our APIs use snake_case.

Good:

GET ads

POST /ads

GET /ads/23

PUT /ads/23

DELETE /ads/23

Bad:

GET /ad/23

GET /listAllAds

POST /ad/create

PUT /updateAds/23

GET /userComments/2

  1. Using HTTP methods to mean something

Each HTTP method has been designed to be used in certain situations.

  • GET retrieves a representation of the resource at the specified URI. The body of the response message contains the details of the requested resource. You should use the GET method when you wish to read data. Not store, not update, not change data. Only read the data
  • POST creates a new resource at the specified URI. The body of the request message provides the details of the new resource. Note that POST can also be used to trigger operations that don’t actually create resources. When you make a POST request everyone in the world expects you to usually STORE something
  • PUT either creates or replaces the resource at the specified URI. The body of the request message specifies the resource to be created or updated. PUT requests are most often used in the context of updating things
  • PATCH performs a partial update of a resource. The request body specifies the set of changes to apply to the resource. A patch request is meant to be used to update resources again but unlike PUT it should update only the changed data whereas PUT can and should update the entire resource
  • DELETE removes the resource at the specified URI.When you wish to delete resources simply use the DELETE method. 

For example

ResourcePOSTGETPUTDELETE
/adsCreate a new adRetrieve all adsBulk update of adsRemove all ads
/ads/1ErrorRetrieve the details for ad 1Update the details of ad 1 if it existsRemove ad 1
/ads/1/reviewsCreate a new review for ad 1Retrieve all reviews for ad 1Bulk update of reviews for ad 1Remove all reviews for ad 1
  1. Using status codes to be meaningful  in error handling
  • 200: result of operation in the response body 
  • 201: create new resource
  • 204: no content if there is no result to return
  • 400 – 499: client side errors
  • 500-599: server side errors
  1. Use Nesting on Endpoints to Show Relationships
  • Good:
    • Different ads posted by users: https://openreal.api.com/ads/users
    • The ads have their reviews, so to retrieve reviews, endpoint can be https://openreal.api.com/ads/id/reviews
  • Note : should avoid nesting more than 3 levels because it makes api less readable. In this case, we recommend that we use HATEOAS to enable navigation to related resources
  1. Use Filtering, Sorting, and Pagination to Retrieve the Data Requested
  • API’s database can get very large. So, it makes the system very slow. Therefore, we need a way to filter the items.
  • Filtering, sorting, paginating are all actions to increase the performance. This lets only retrieve, sort and arrange data into pages, so the server doesn’t get too occupied with requests
  1. Use SSL (Secure Socket Layer)  for security

Treat our API the same way we would our house.

  • Use a Bearer token for authentication.
  • Require HTTPS / TLS / SSL to access your APIs. OAuth2 Bearer tokens demand it. Unencrypted communication over HTTP allows for simple eavesdropping and impersonation.
  1. Cache data to improve performance

We can add caching to return data from the local memory cache instead of querying the database to get the data every time we want to retrieve some data that users request. The good thing about caching is that users can get data faster. However, the data that users get may be outdated. This may also lead to issues when debugging in production environments when something goes wrong as we keep seeing old data.

There are many kinds of caching solutions like Redis, in-memory caching, and more. We can change the way data is cached as our needs change.

  1. Be clear with versioning

REST API should have different versions so that we don’t force users to migrate to a new version..

Using semantic versioning to name versions: major.minor.patch for example 1.0.0

It depends on your needs that you name the version more convenient.

I prefer to use:  https://openreal.api.com/v1/

  1. Provide accurate API document

The good document for the API will help users learn and figure out how to use it correctly.

The documentation should contain:

  • relevant endpoints of the API
  • example requests of the endpoints
  • implementation in several programming languages
  • messages listed for different errors with their status codes

Tools for writing the API document: Swagger or Postman.

Why are REST API design guidelines important?

(Including English version)

Việc viết một tài liệu hướng dẫn thiết kế REST API khá nhàm chán không ? Có ai quan tâm để đọc đâu ?  và liệu nó có đáng không ?

Những câu hỏi này nhắc mình nhớ đến câu chuyện sau: trong một dự án của công ty nọ, có nhóm lập trình viên (một tech lead và 2 bạn lập trình viên) chịu trách nhiệm viết REST API cho ứng dụng. 

Sau khi phân tích yêu cầu, phân chia nhiệm vụ cho mỗi thành viên viết các chức năng và bắt tay thiết kế và cài đặt các api. Mỗi người cũng thống nhất viết theo nguyên tắc REST API (chỉ trao đổi miệng). 

Trong quá trình cài đặt, lập trình viên A đặt tên resource là GET /users, POST /property-legals, sử dụng mã lỗi như 400,409.., trong khi lập trình viên B đặt tên là GET /user, POST /property_legal, không trả về mã lỗi mà chỉ ghi nội dung lỗi như “Mã không hợp lệ” .. 

Đến khi anh tech lead xem lại thì thấy rằng mỗi lập trình viên làm các cách khác nhau. Thế là triệu tập một vài cuộc họp để trao đổi và thống nhất cách đặt tên, cách trả về như thế nào. Cứ mỗi đợt xem lại, anh tech lead lại gọi họp lại để thêm quy tắc cho vấn đề bảo mật hoặc đối tượng trả về etc. Chính vì vậy, gây mất thời gian cho các thành viên phải cập nhật, sửa lại và tinh thần không thoải mái.

Cũng có nhiều lý do khác nhau mà tài liệu này mọi người không quan tâm ví dụ:

  • Thông thường khách hàng sẽ cung cấp tài liệu REST API để cho lập trình viên sử dụng 
  • Công ty không có bộ hướng dẫn thiết kế REST API có sẵn 
  • Lập trình viên nghĩ chỉ có mình làm trên dự án .. 

Vì vậy, nếu ko có tài liệu hướng dẫn thiết kế REST API thì sẽ gây những khó khăn như sau:

  • Khó bảo trì mã nguồn: mỗi lập trình sẽ viết những cách khác nhau vì vậy không có sự thống nhất giữa cách đặt tên uri, resources, status codes ..
  • Mất thời gian để trao đổi và sửa..

Chính vì thế, việc có tài liệu hướng dẫn thiết kế REST API sẽ giúp:

  • Việc thiết kế và xem duyệt REST API sẽ đơn giản hơn
  • Bảo đảm sư nhất quán những API 
  • Ít tranh luận hơn

Lưu ý rằng tài liệu hướng dẫn thiết kế REST API cũng nên đơn giản và dễ hiểu cho tất cả mọi người. Như vậy, tùy thuộc vào doanh nghiệp hoặc tính chất sản phẩm mà công ty sẽ định nghĩa những quy tắc cho phù hợp.

Thường trong tài liệu hướng dẫn thiết kế REST API, nó bao gồm những thông tin chính sau:

  • Quy trình thiết kế REST API
  • Quy ước đặt tên cho Resource: mình đề nghị sử dụng tiếng anh để đặt tên vì tiếng việt không dấu có nhiều ý nghĩa sẽ gây nhầm lẫn
    • ví dụ tên resource là users, nếu dịch sang tiếng việt là người dùng và ghi không dấu nguoi_dung, nguoidung
  • Phương thức HTTP (PUT, POST, GET, PATCH): Khi nào thì dùng những phương thức này ..
  • Mã trạng thái HTTP / HTTP Status codes: có trên 70 mã trạng thái HTTP nhưng mình nghĩ chỉ sử dụng vài nhóm với vài mã trạng thái thôi
    • Ví dụ: nhóm mã thành công 2xx: sử dụng 2 mã 200 và 201 (created)
    • Nhóm mã 3xx, 4xx, 5xx (500) 
  • Quy ước đặt phiên bản cho API /API Versioning: cái này cũng cần thiết, có nhiều cách đặt phiên bản ví dụ: major.minor.patch or v1, v2.. Tùy theo nhu cầu thì sử dụng cách đặt phiên bản cho phù hợp. Mình thì thích cách dùng v1,..
  • Quy ước cho tìm kiếm, lọc và sắp xếp (Search, filtering, sorting)
  • Xử lý lỗi / Error handling
  • Bảo mật / Security

Đối với những công ty lớn như google, facebook, microsoft, github, amazon etc họ đều phải có tài liệu này để giúp các nhóm lập trình viên làm việc chung với nhau.

Mặc dù công việc viết hướng dẫn này rất chán nhưng nó sẽ tiết kiệm cho chúng ta nhiều thời gian và tiền bạc.

// English version 

Why are API design guidelines important?

Writing API design guidelines is boring? Does anyone care to read? And is it worth it ?

These questions remind me of the following story: in a project of a certain company, there was a group of programmers including a tech lead and 2 programmers are responsible for writing a REST API for the application.

After analyzing the requirements, assigning each member to write the functions and start designing and implementing the api. Each person also agreed to comply with the principle of REST API (only oral communication).

During the programming, programmer A named the resource GET /users, POST /property-legals, using an error code like 400,409.., while programmer B named it GET /user, POST /property_legal, doesn’t return error code but just write error content like “Invalid code” ..

When the tech lead reviewed, he saw that each programmer did it differently. So he called a few meetings to discuss and agree on how to name and set error codes. Every review, the tech lead calls a meeting to add rules for security or return objects etc. Therefore, it takes time for members to update, correct and feel uncomfortable.

There are also many different reasons that people are not interested in this document, for example:

  • Usually the client will provide API specification documentation for the programmer to use
  • The company does not have available API design guidelines
  • The programmer thinks he works solo on the project..

Therefore, if there is no API design guidelines, it will cause the following difficulties:

  • Difficult to maintain source code: each programmer will program them differently so there is no consistency about naming uri, resources, status codes..
  • Takes time to discuss and fix …

Therefore, API design guidelines will help:

  • Simpler API design and review
  • Ensuring API Consistency
  • Less discussion

Note that the API design guidelines should also be simple and understandable for everyone. Thus, depending on the business or the organization, the company will define the rules accordingly. But often in API design guidelines, it covers the following main information:

  • REST API Design workflow
  • Resource naming: I suggest using English for naming because unsigned Vietnamese has many meanings that will cause confusion.
    • For example, the resource name is users, in English: users, but in Vietnamese: nguoi_dung, nguoidung etc.
  • HTTP methods (PUT, POST, GET, PATCH): When & How should we use these operations ?
  • HTTP Status codes: there are more than 70 HTTP status codes but I think only use a few groups with a few status codes:
    • Example: 2xx success code: use 2 codes such as 200 (success) and 201 (created)
    • Code group 3xx, 4xx, 5xx (500)
  • API Versioning: this is also necessary, there are many ways to set the version for example:
    • Method 1:  major.minor.patch
    • Method 2:  v1, v2…
    • Depending on your needs, use the appropriate version. I like using v1,..
  • Searching, filtering and sorting
  • Error handling
  • Security
  • ….

For big companies like google, facebook, microsoft, github, amazon etc, they all must have this document to help their teams work together.

In conclusion, although writing these guidelines are boring, it will save us a lot of time and money.