Rails5.2 Grape으로 API 제작, Swagger에서 속편 확인

10638 단어 Rails

필기 리필. API 콘셉트 조금만 더 해볼게요.


저번
JSON 편지에 이런 걸 붙여봤어요.
result: true,
message: "取得しました",
config/initializers/locale.rb
Rails.application.config.i18n.default_locale = :ja
config/locales/api.yml
ja:
  api:
    success_message:
      get: 取得しました
      create: 作成しました
      update: 更新しました
      delete: 削除しました
app/views/api/v1/task_displays/index.jbuilder
json.result true
json.message I18n.t('api.success_message.get')
json.tasks @tasks do |task|
  json.(task, :id, :name, :description)
end

오류 대응

  • 오류 정의 오류에 대비한 모듈
  • app/api/versions/v1/api.rb
    module Versions
      module V1
        class API < Grape::API
          version 'v1', using: :path
          format :json
          formatter :json, Grape::Formatter::Jbuilder
          prefix :api
    
          # エラー対応
          rescue_from :all, backtrace: true
          error_formatter :json, ::MediaSite::ErrorFormatter
    
          include ::Versions::V1::TaskDisplays
    
          # :nocov:
          if Rails.env.development? || Rails.env.staging?
            add_swagger_documentation add_version: true
          end
          # :nocov:
        end
      end
    end
    
  • 오류 발생 시 자주 사용하는 모듈
  • app/api/media_site/error_formatter.rb
    module MediaSite
      module ErrorFormatter
        # error!メソッド実行時にJSONを出力する
        # 5つのパラメーターが渡されるのでそれを元にエラー出力
        # @param [Object] message メッセージまたはメッセージ+エラーコードのHash
        # @param [Array] _backtrace backtrace
        # @param [Hash] _options options
        # @params [Symbol] _env env
        # @params [不明] _other
        # @return [String] JSON文字列
        def self.call(message, _backtrace, _options, _env)
          if message.is_a?(Hash)
            { result: false }.merge(message).to_json
          else
            { result: false, message: message }.to_json
          end
        end
      end
    end
    

    매개변수 추가

  • id를 지정하기 위해 작업 수행
  • app/api/versions/v1/task_displays.rb
    module Versions
      module V1
        module TaskDisplays
          extend ActiveSupport::Concern
          included do
            namespace :tasks do
              namespace :displays do
                desc 'タスク一覧を取得する'
                get '', jbuilder: 'v1/task_displays/index' do
                  @tasks = Task.all
                end
    
                desc "個別タスクの取得"
                params do
                  requires :id, type: Integer
                end
                # http://localhost:3000/api/1/task_displays/{:id}
                get ':id', jbuilder: 'v1/task_displays/detail' do
                  @task = Task.find(params[:id])
                end
    
              end
            end
          end
        end
      end
    end
    
    app/views/api/v1/task_displays/detail.jbuilder
    json.result true
    json.message I18n.t('api.success_message.get')
    json.task do
      json.(@task, :id, :name, :description)
    end
    
  • 결과
    http://localhost:3000/api/v1/tasks/displays/1
  • swagger에도 자동 추가
  • 오류 발생 시
    작업이 없는 id를 지정할 때
    "result:false"가 되고 메시지에 오류 메시지 입력
  • https://github.com/katafuchix/api_sample

    좋은 웹페이지 즐겨찾기