Tạo API từ Lotus Framework
lotusrb
11
Ruby
116
White

My Mai viết ngày 29/05/2015

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/usersapi/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é

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

My Mai

34 bài viết.
186 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
23 21
Bạn muốn load 3 image khác nhau (Ý mình ở đây là dùng tag không phải background nhé) cho 3 loại màn hình khác nhau (small, medium, large). Bạn sẽ l...
My Mai viết hơn 3 năm trước
23 21
White
21 8
Lotus là gì? (Link) là một Ruby Web Framework mới với chú trọng vào cấu trúc tách rời với thiết kế đơn giản và dễ hiểu. Hiện tại thì Lotus vừa re...
My Mai viết hơn 3 năm trước
21 8
White
19 9
Tham gia cộng đồng Thoáng đó cũng đã 2 năm từ lúc tớ tham gia cộng đồng Ruby Việt Nam. Giờ ngồi ngẫm lại được gì và mất gì :v Thật thì chẳng mất...
My Mai viết 2 năm trước
19 9
Bài viết liên quan
White
4 2
__Chú thích__: Đây là bản dịch tiếng Việt của bài viết gốc của tôi. Nếu bạn muốn xem bản tiếng Anh, xin hãy trỏ tới URL (Link) Lời mở (Link) là ...
Lơi Rệ viết hơn 3 năm trước
4 2
White
8 6
Chưa xem phần 2? Xem (Link) Trong bài viết này tôi giới thiệu cho các bạn về khái niệm function arity, một cách gọi mĩ miều của số lượng argument ...
Lơi Rệ viết 3 năm trước
8 6
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
34 bài viết.
186 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!