Tạo API từ Lotus Framework
Tiếp tục bài viết lần trước về Bắt đầu một application với Lotus Framework & Bắt đầu một database với Lotus Framework bây giờ chúng ta sẽ tìm hiểu thêm cách tạo API từ Lotus Framework. Tại sao lại sử dụng Lotus để tạo web API Lý do đầu tiên Lotus là 1 web framework chính vì vậy nó hỗ ...
Tiếp tục bài viết lần trước về Bắt đầu một application với Lotus Framework & Bắt đầu một database với Lotus Framework bây giờ chúng ta sẽ tìm hiểu thêm cách tạo API từ Lotus Framework.
Tại sao lại sử dụng Lotus để tạo web API
- Lý do đầu tiên Lotus là 1 web framework chính vì vậy nó hỗ trợ cho việc tạo API
- Thứ 2 Lotus có sự chia cắt rõ ràng giữa model, controller và view
- Thứ 3 cấu trúc modular cho phép người dùng dễ dàng phân chia các version
- Thứ 4 Lotus có lớp presenter riêng, nó hỗ trợ các controller trả về 1 cấu trình data (json hoặc xml) như người dùng mong muốn.
Update Gemfile
rallyapp/Gemfile
gem 'representative'
Gem này dùng để tạo XML & JSON data đại diện cho ruby objects. Trong phần này mình sẽ tạo JSON data.
Chạy lại lệnh bundle install nha.
Bắt đầu công việc tạo API
Mình sẽ hướng dẫn các bạn tạo API để web một web service có thể query user
Bước 1: Định nghĩa endpoint routing, nó dựa trên kiểu RESTful routing
Để tạo 1 routes như sau /api/v1/users (ý nghĩa của nó là mình sẽ get tất cả users)
Tạo folder có cấu trúc:
rallyapp/apps/api/v1/config tạo file routes.rb
File routes.rb này để define routes vào đây
ví dụ bạn muốn define api/v1/users và api/v1/users/1 chúng ta sẽ trong file routers.rb
resources :users, only: [:index, :show]
Bước 2: Chúng ta sẽ sử dụng JSON data cho app
Có nhiều gem hỗ trợ việc tạo JSON data nhưng ở bài viết này mình sử dụng gem representative
Tạo folder có cấu trúc
rallyapp/apps/api/v1/presenters/users tạo file index.rb
require 'representative/json' module ApiV1 module Presenters module Users class Index def initialize(users) @users = users end def render Representative::Json.new do |r| r.list_of :users, @users do r.element :id r.element :name r.element :gender r.element :about r.element :image_url end end.to_s end end end end end
Bước 3: Controller action
Tạo folder có cấu trúc:
rallyapp/apps/api/v1/controllers/users tạo file index.rb
Sử dụng UserRepository.all để get all tất cả users
accept :json chấp nhận phần content-type của dữ liệu trả về là json
self.body = để gán response trả về làm như thế sẽ bypass cái presenter layer mặc định của Lotus
module ApiV1 module Controllers module Users ## # Return users # # GET /api/v1/users # # example: # # curl -i -H "Accept: application/json" http://0.0.0.0:2300/api/v1/users # # status # => 200 # class Index include ApiV1::Action accept :json def call(params) users = UserRepository.all self.body = ApiV1::Presenters::Users::Index.new(users).render end end end end end
Bước 4
Khởi động lại server để kiểm tra kết quả:
lotus server
Bước5
Vào folder rallyapp/config/environment.rb
Tương tự như Web application bạn add thêm 2 dòng này cho api:
require_relative '../apps/api/v1/application'
mount ApiV1::Application, at: '/api/v1' vào Lotus::Container.configure
Bước 6
Ở browser chạy lệnh này http://localhost:2300/api/v1/users để get all users
Nếu các bạn pull code ở github của mình về các bạn có thể http://localhost:2300/api/v1/users/2 để get user có id là 2
NOTE Đọc phần 1 và phần 2 trước khi xem phần 3 này nha.
Xem chi tiết code ở Github
Bài tiếp theo mình sẽ hướng dẫn viết 1 web service đơn giản, để get data dựa vào API đã tạo trong bài này nhé