12/08/2018, 16:07

Xây dựng API với grape và grape swagger

Thêm vào trong Gemfile gem "grape" gem "grape-swagger" Để sử dụng gem, bạn cần một root API chính để mount các resouces khác Cấu trúc thư mục thì bạn bên để api/api.rb class API < Grape::API VERSION = name.downcase version VERSION, using: :path mount Users ...

Thêm vào trong Gemfile

gem "grape"
gem "grape-swagger"

Để sử dụng gem, bạn cần một root API chính để mount các resouces khác

Cấu trúc thư mục thì bạn bên để api/api.rb

class API < Grape::API
  VERSION = name.downcase
  
  version VERSION, using: :path
  mount Users

  add_swagger_documentation hide_documentation_path: false, api_version: VERSION, info: {
   title: "API demo"
  }
end

Ở trên mình khai báo Class API làm root và mount Users vào trong root. Dòng add_swagger_documentation để swagger API tự động tạo ra document nếu bạn vào /swagger_doc

Trong Users bạn có thể định nghĩa các resources của mình

class V1::Users < Grape::API
  resources :users do
    desc "Sign up" do
      detail "Register a new user"
    end
    params do
      requires :email, type: String, regexp: Settings.validations.email_regex, allow_blank: false
    end
    post do
      SignUp.perform! declared(params)[:email]
    end
    
    desc "List users" do
      detail "List all users"
    end
    get serializer: API::AdminSerializer do
      render Admin.all
    end
    
    desc "Finish registration" do
      detail "User confirm the registration."
    end
    params do
      requires :confirm_email_token, type: String, allow_blank: false
      requires :password, type: String, allow_blank: false,
        desc: "Password for the first time login"
    end
    put do
      // do something
    end
  end
end

Cụ thể thì ở đoạn code trên sẽ yêu cầu params là emails, nếu có emails trong request bạn gửi lên thì nó mới thực hiện các phương thức trong post.

Grape cho phép ta enable CORS, CORS là một cơ chế giúp resources từ một domain này có thể request được resources của domain khác

config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins ENV["ORIGIN"]
        resource "*", headers: :any, methods: [:get, :post, :options, :delete, :put, :patch]
      end
    end

Swagger UI cho phép bạn có thể tạo ra document dễ nhìn hơn, có giao diện cụ thể trên web Bạn chỉ cần pull docker images của nó về và chạy, sau đó vào localhost, trỏ đến tên document của application

docker pull swaggerapi/swagger-ui
docker run -p 80:8080 swaggerapi/swagger-ui

Vào localhost sẽ có giao diện như sau

Bạn có thể serialize model của mình với gem 'active_model_serializers Thêm vào Gemfile

gem "active_model_serializers"

Sau đó chạy bundle và

rails g serializer user

Khi đó sẽ tạo ra một file app/serializers/user_serializer.rb Ta định nghĩa các attributes

class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :first_name, :last_name, :created_at
end

Ở trong api chúng ta có thể hiện thị ra luôn

desc "List users" do
   detail "List all users"
end
get serializer: API::AdminSerializer do
   render Admin.all
end
0