在第1部分中,我们已经构建了一个简单的API。现在我们有两个模型,分别是book和flow,我们创建了第一个API用来返回图书列表。
我们的目录结构类似于:
.app
.api
.book_store
.v1
- books.rb
base.rb
在第二部分,我们会使用Grape-Entity并且向你展示怎样通过请求API获取一本特定书的信息。
Entities
Entities是与Grape框架搭配使用的。Entities允许我们从模型中筛选我们想要的数据。
现在我们发出请求:
http://localhost:3000/api/v1/books
会获得如下结果:
{"id":1,"isbn":3999,"title":"Enhanced Smell","stock":9,"created_at":"2017-04-25T20:33:46.292Z","updated_at":"2017-04-25T20:33:46.292Z"}
通过在我们的API中创建entities文件夹来简化返回的数据。
mkdir -p app/api/book_store/entities
在新建的文件夹下创建book entity。
touch app/api/book_store/entities/book.rb
我们可以再新建的book.rb文件下添加如下代码:
module BookStore
module Entities
class Book < Grape::Entity
expose :isbn
expose :title
expose :stock
end
end
end
通过ID返回信息
我们需要创建第二个方法并且以同样的方法生成路由。
在app/api/book_store/v1/books.rb文件中添加如下代码:
desc 'Return a specific book'
route_param :id do
get do
book = Book.find(params[:id])
present book
end
end
route_param :id :允许我们通过ID来选择一本书。
看一下grape的路由:
rails grape:routes
返回
GET | /api/:version/books(.json) | v1 | Return list of books
GET | /api/:version/books/:id(.json) | v1 | Return a specific book
现在我们有两个路由了,我们来试一下新增加的路由!
http://localhost:3000/api/v1/books/1
结合entity使用:
present book替换为
present book, with: BookStore::Entities::Book
总结
至此我们完成了第二部分,在第二部分中我们创建了entity并且向API中添加了第二个路由。
在第三部分中我们会尝试返回一些更复杂的结构!
译自
https://medium.com/@clementrollon/build-a-basic-api-with-grape-api-grape-entity-part-2-25ed0d22dfb7
网友评论