Статьи

Сборка отличного аписа с виноградом

big_grape

API необходимы по разным причинам, например, мобильным приложениям для взаимодействия с бэкэнд-операциями CRUD. Создание поддерживаемых API-интерфейсов — непростая задача. По мере роста приложения растет и необходимость версии и поддержки API.

В этом уроке мы рассмотрим Grape , микро-фреймворк для создания поддерживаемых REST-подобных API в Ruby.

Со страницы Github винограда:

Grape — это REST-подобный API-фреймворк для Ruby. Он предназначен для работы на Rack или в дополнение к существующим платформам веб-приложений, таким как Rails и Sinatra, предоставляя простой DSL для простой разработки API-интерфейсов RESTful. Он имеет встроенную поддержку общих соглашений, включая несколько форматов, ограничение субдоменов / префиксов, согласование контента, управление версиями и многое другое.

Наш проект

Мы будем использовать Rails и Grape вместе для создания API. Он будет предоставлять модель Employee другим приложениям, потребляя серверные операции CRUD для этой модели.

API может использоваться многофункциональными веб-приложениями, например, созданными с использованием AngularJS, Backbone.js и т. Д. Или собственными мобильными приложениями, для создания, редактирования, обновления и удаления сотрудников.

Вот конечные точки API, которые мы будем создавать:

//Get all employee details
GET /emp_api       

//Add an employee
POST /emp_api/  {name:"Jay", address:"Kerala, India", age:"34"}             

//Delete an employee         
DELETE /emp_api/1

//Update an employee
PUT /emp_api/1

Начиная

Давайте начнем с создания приложения Rails и установки драгоценного камня Grape. Я использую Rails 4.1.6.

Создайте новый проект Rails, пропустив bundle install

 rails new emp_api --skip-bundle

После того, как все файлы проекта созданы, перейдите в каталог проекта ( emp_api Откройте Gemfile и включите виноградный камень в конец файла.

 gem 'grape'

Затем установите все необходимые гемы с помощью Bundler:

 bundle install

Сгенерируйте модель Employee для основных операций CRUD, которые будут представлены API:

 rails g model EmpData name:string address:string age:integer
rake db:migrate

Все файлы API будут жить в папке приложения . Создайте новую папку с именем api внутри emp_api / app / .

Внутри emp_api / app / api создайте еще одну папку с именем employee и файл в этом каталоге с именем data.rb. Этот файл содержит класс для доступа к модели Employee.

Внутри emp_api / app / api / создайте еще один файл с именем api.rb, где мы смонтируем класс, определенный в emp_api / app / api / employee / data.rb.

Согласно инструкциям на страницах Grape GitHub , поскольку мы разместили наш код API в app / app , этот каталог необходимо добавить в пути загрузки / автозагрузки. Установите его в config / application.rb, как показано ниже:

 require File.expand_path('../boot', __FILE__)

require 'rails/all'

Bundler.require(*Rails.groups)

module EmpApi
  class Application < Rails::Application
    ## Newly Added code to set up the api code
    config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
    config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
  end
end

Создание API

Grape API — это Rack-приложения, созданные путем создания подкласса Grape::API Давайте начнем с создания первой конечной точки API для извлечения всех данных о сотрудниках. Откройте app / api / employee / data.rb и создайте класс модуля, как показано ниже:

 module Employee
  class Data < Grape::API

    resource :employee_data do
      desc "List all Employee"

      get do
        EmpData.all
      end

    end

  end
end

Нам нужно получить доступ к функциональности класса Employee::Data Итак, мы будем использовать mountEmployee::DataAPI

Итак, откройте app / api / api.rb и смонтируйте Employee::Data

 class API < Grape::API
  prefix 'api'
  version 'v1', using: :path
  mount Employee::Data
end

Откройте app / config / rout.rb и включите следующий код для маршрутизации вызовов API на наш корневой адрес:

 Rails.application.routes.draw do
  mount API => '/'
end

Запустите сервер рельсов:

 rails server

Откройте новый терминал и попробуйте:

 curl http://localhost:3000/api/v1/employee_data.json

Вы увидите [] У нас нет способа добавить сотрудников, так что давайте исправим это.

Добавьте другую конечную точку API для создания нового сотрудника. Для создания сотрудника нам понадобятся определенные значения, такие как имя, адрес и возраст. Grape позволяет нам определять, являются ли эти параметры обязательными или необязательными в самом API.

Откройте app / api / employee / data.rb и добавьте следующий код, чтобы создать конечную точку API для создания сотрудников.

 desc "create a new employee"
## This takes care of parameter validation
params do
  requires :name, type: String
  requires :address, type:String
  requires :age, type:Integer
end
## This takes care of creating employee
post do
  EmpData.create!({
    name:params[:name],
    address:params[:address],
    age:params[:age]
  })
end

Перезапустите сервер и используйте curl

 curl http://localhost:3000/api/v1/employee_data.json -d "name=jay;address=delhi;age=25"

Теперь у нас должен быть сотрудник:

 curl http://localhost:3000/api/v1/employee_data.json

[{"id":1,"name":"jay","address":"delhi","age":25,"created_at":"2014-10-27T16:43:49.303Z","updated_at":"2014-10-27T16:43:49.303Z"}]

Бинго.

API удаления и обновления для модели сотрудника выполняется по аналогии с нашими конечными точками чтения и создания.
Для удаления конечной точки требуется идентификатор сотрудника:

 # app/api/employee/data.rb

 desc "delete an employee"
 params do
   requires :id, type: String
 end
 delete ':id' do
   EmpData.find(params[:id]).destroy!
 end

Перезапустите сервер Rails и протестируйте API, удалив сотрудника, которого мы создали ранее.

 curl -X DELETE http://localhost:3000/api/v1/employee_data/1.json

{"id":1,"name":"jay","address":"delhi","age":25,"created_at":"2014-10-27T16:43:49.303Z","updated_at":"2014-10-27T16:43:49.303Z"}

Теперь, если вы проверяете список сотрудников API, вы должны получить пустой ответ.

Далее, чтобы обновить данные сотрудника, нам нужно будет передать идентификатор сотрудника и значения, которые будут обновлены. Добавьте следующий код, чтобы создать конечную точку API для обновления адреса сотрудника:

 # app/api/employee/data.rb

desc "update an employee address"
params do
  requires :id, type: String
  requires :address, type:String
end
put ':id' do
  EmpData.find(params[:id]).update({
    address:params[:address]
  })
end

Но у нас нет сотрудника для обновления. Помните, что мы удалили последнего сотрудника, поэтому нам нужно добавить его обратно, чтобы обновить его.

Перезагрузите сервер и сначала добавьте нового сотрудника,

 curl http://localhost:3000/api/v1/employee_data.json -d "name=roy;address=kerala;age=25"

{"id":2,"name":"roy","address":"kerala","age":25,"created_at":"2014-10-27T16:59:54.090Z","updated_at":"2014-10-27T16:59:54.090Z"}

Теперь используйте следующую команду для обновления адреса нового сотрудника:

 curl -X PUT http://localhost:3000/api/v1/employee_data/2.json -d "address=mumbai"

true

Завершение

В этом уроке мы начали создавать простой CRUD API с использованием инфраструктуры Grape. Подробная документация относительно винограда доступна на их страницах GitHub .

Код из этого урока доступен на GitHub .