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
Итак, мы будем использовать mount
Employee::Data
API
Итак, откройте 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 .