0

Rails 5 API Mode: Overview

Rails 5 cuối cùng cũng chính thức phát hành, do đó giờ là lúc chúng ta cùng nhìn một cách khái quát về những điều mới mẻ được bổ xung mà chúng ta sẽ sử dụng. Điều đầu tiên nói đến đó là sự sự xuất hiện của Rails 5 API mode - nó cho phép chúng ta xây dựng web API mà không cần phải sử dụng những thứ ngổn ngang mà chúng ta phải include vào controllers trước đó.

Web API là gì?

APIs là viết tắt của Application Programming Interfaces - một cách hiểu đơn giản là một giao diện mà qua đó 2 phần mềm có thể giao tiếp với nhau. Ngày nay, khá là phổ biến để xây dựng web APIs và nó được sử dụng như backend cho các ứng dụng mobile hay các ứng dụng JavaScript. Web API hay thường dùng JSON(hoặc XML) thay cho HTML. JSON dễ dàng hiểu và sử dụng đối với một clinet tự động và ngày nay chúng ta dễ dàng bắt gặp ở bất cứ web API nào cũng đều sử dụng.

Nguồn gốc của Rails 5 API mode?

Tính năng này không đến từ đâu mới mẻ và xa lạ, nó thực chất là Rails Api project được tích hợp trong Rails 5.

Sử dụng Rails 5 API mode như thế nào?

Tạo một ứng dụng Rails API-only đơn giản như sau:

rails new my_app --api

Bằng cách sử dụng --api, ứng dụng tạo ra sẽ tối giản đi middleware, nó cũng không tạo ra views/helpers/assets và các ApplicationController thay vì thừa kế từ ActionController::Base bằng ActionController::API. Khai báo sau sẽ được thêm vào file config/application.rb, và khiến cho ứng dụng trở thành một web API only:

# config/application.rb

module MyApp
  class Application < Rails::Application
    config.api_only = true
  end
end

Và sau đó, bạn sẽ dễ dàng để phát triển ứng dụng khá giống như với một ứng dụng RoR thông thường. Ứng dụng của bạn sẽ không có views, helpers hay assets bởi vì tất cả chúng đã có ở client. Thay bằng view, bạn có thể sẽ sử dụng một kiểu như serializers để xây dựng JSON document.

Tại sao sử dụng Rails API mode thay vì Sinatra hoặc Grape?

Mọi người vẫn thường hỏi tại sao sử dụng Rails để xây dựng một web API, hơn là sử dụng cái gì đó nhỏ gọn và đơn giản hơn như Grape hay Sinatra. Trong khi các frameworks có thể đáp ứng để xây dựng các ứng dụng nhỏ, bạn có thể nhanh chóng tìm được những thư viện để sử dụng thêm vào như một ORM, một vài builder, một tính năng auto-reload,.. Và cuối cùng bạn sẽ khiến cho ứng dụng của mình trở thành một ứng dụng Rails khổng lồ được tạo ra từ nhiều thư viện khác nhau. Điều đó thực sự không phải là không tốt. Với cách tiếp cận này, bạn có thể chọn chính xác gem nào để sử dụng. Nhưng quyết định để đi cùng Rails cũng là một sự lựa chọn thích hợp để thay thế khác. Hơn thể nữa, Rails handles rất nhiều những thứ mà bạn có thể sử dụng, và bạn không phải tìm trong một framework nhỏ hơn nào khác(như bảo mật, conditional GETs, caching,..)

Khi nào thì bạn sử dụng Rails API mode?

Bạn chỉ nên sử dụng Rails 5 API mode nếu ứng dụng của bạn là một web API. Điều này có nghĩa là bạn sẽ không gửi bất kì HTML nào, thay vào đó là JSON hoặc XML, những thứ mà client có thể dễ dàng sử và ưa thích sử dụng.

Middleware

Rack middleware là một sự thi hành đầy đủ của pipeline design pattern và khá là nặng nề được sử dụng trong RoR để thi hành trên các request và response objects. Mặc định, ứng dụng Rails API-only đi cùng với giới hạn của middleware. Điều này có nghĩa là chúng được tối giản đi các chức năng không cần thiết. Để thêm một middleware khá là đơn giản như thêm một dòng khai báo trong file application.rb. Ví dụ nếu bạn muốn thêm vào Rack::Deflater vào API:

# config/application.rb
module Alexandria
  class Application < Rails::Application
    config.api_only = true
    config.middleware.use Rack::Deflater
  end
end

Để bỏ đi một middleware mặc định nào đó, sử dụng delete thay vì use. Ví dụ như

# config/application.rb
module Alexandria
  class Application < Rails::Application
    config.api_only = true
    config.middleware.delete ActionDispatch::Request
  end
end

Bạn có thể liệt kê ra danh sách middleware được sử dụng trong ứng dụng của bạn bằng lệnh:

rails middleware

References

Rails 5 API Mode: Overview


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.