11/08/2018, 21:19

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é

0