使用Rails构建一个TO-DO应用的JSON API (Part III)

第三部分,我们要做三件事情 1.版本管理 2. 序列化 3. 分页,以上都学会以后,可以开发完整的服务端了,全栈工程师~😯

额……在开始之前,我们先设置seed,假的数据,方便后面的测试

检查Gemfile

编辑db/seeds.rb

然后,本地开发环境重置数据库

如果代码已经提交到heroku,那么,heroku 重置数据库

好的,准备工作完成,开始进入正题

版本管理

最常见的场景,客户端1.0用到了一个API,但是下个版本1.1中,需要服务端改变同个API中的返回字段,但是用户群在客户端发布1.1以后不选择升级,那么服务端就需要适配两个版本的接口,需要引入版本管理。在Rails中,如果你需要做这件事情,你只需要做两件事:1. 添加路由约束,这会依据每个request的header选择不同的接口版本。2. 给控制器命名空间,controller中不同的namespace处理不同的版本 。

编辑

依据标准写法,检查这个外链,很明显header里面有对应版本号的字段。从request对象,进入Accept的headers,然后检查版本信息,找到对应的接口,这个过程叫做content negotiation,外链,简单讲就是同样的URI对应不同的版本,服务端驱动的版本管理。依据Media Type Specification,你可以通过vendor tree自己定义media types,比如application/vnd.example.resource+json

好的,现在我们已经有了约束的类,接下去需要改变路由。由于我们不会改变URI来做版本管理(顺便说一句这是错误的做法,是反设计的,但很多公司仍然在使用😄),所以我们会使用module scope和namespace。

编辑config/routes

version constraint是全局有效的,v1是默认版本,也就是说没指定版本就是v1。如果我们指定新的版本,Rails会从高到低去匹配版本号,使用那个matches方法。然后我们看到controller,建立文件夹

把相关文件移动到这个文件夹下面

还没完,记得加module的版本号,看到app/controllers/v1/todos_controller.rb

同样的,app/controllers/v1/items_controller.rb

接下去是v2的版本

编辑config/routes.rb

注意顺序,不是默认的版本要在默认的版本上方

编辑app/controllers/v2/todos_controller.rb

因为只是测试用,所以就给条消息吧

用v1登陆,拿到token用给v2的todos发get请求,是有效的也是正确的 继续阅读使用Rails构建一个TO-DO应用的JSON API (Part III)

使用Rails构建一个TO-DO应用的JSON API (Part II)

在第一部分中,我们创建了基于JSON API的Rails应用,搭建了Rspec测试框架,也介绍了简单的测试驱动的开发。在第二部分中,我们要建立JWT认证(JSON Web Token),包换注册和登录,当然还是使用TDD。认证原理的外链

认证涉及到用户,那先创建用户

建立model的测试,spec/models/user_spec.rb

添加固件,spec/factories/users.rb

添加model的约束,app/models/user.rb

has_secure_password,rails5会自动添加相关属性password_digest,经过信息摘要处理的password,总不能在数据库里存储明文密码吧。检查gemfile确认存在

接下去要做的几件事情:
1. JsonWebToken: Encode & decode jwt tokens
2. AuthorizeApiRequest: 每一个API请求的认证
3. AuthenticateUser:  认证用户
4. AuthenticationController:认证流程 继续阅读使用Rails构建一个TO-DO应用的JSON API (Part II)

使用Rails构建一个TO-DO应用的JSON API (Part I)

第一部分包括,介绍,配置并建立应用,基本业务逻辑与测试

介绍:众所周知Rails最初是为了迅速构建Web应用而建立的框架,但是技术总是会随着发展而变化,移动端的应用不需要很多富文本信息,作为服务端只要提供纯粹的JSON API就够了。所以去年Rails5发行以来,
rails-api(https://github.com/rails-api/rails-api)这个gem被整合到Rails内核中。对比于同样使用Rails建立的普通的Web App,他们的区别是:

1. 应用的中间件(middleware)减少了

2. ApplicationController 继承自ActionController::API,而不是ActionController::Base

3. 不需要建立的对应的视图文件,不需要HTML,CSS,嵌入式Ruby什么的那一堆东西

接下去,我们来建立这个应用,检查下环境:

整理下,我们需要的RESTful API,给自己一个小目标😊:

好的,开始建立应用

–api 是说明应用只是支持JSON API,那些Web应用的中间件我们不要。-T是说,我们不要Rails自带的测试框架Minitest,因为我们要测试Request,还有他的返回值,RSpec是首选。看下我们需要的gem,并给出list:

这是最后的Gemfile:

完了bundle install,我们在本地使用sqlite3数据库,但是heroku不支持,换成了Postgres。接下来我们配置下Rspec

你会发现增加了以下三个文件:.rspec, spec/spec_helper.rb, spec/rails_helper.rb

再增加一个factories目录:

然后我们配置这些添加的Gem

打开spec/rails_helper.rb

继续阅读使用Rails构建一个TO-DO应用的JSON API (Part I)

使用Rails5构建简单的IM

Rials5带来了很多新的功能,能让我们更加容易地书写web app, json API的接口,但最激动人心的应该是actioncable,长链接websocket变得如此简单,来我们用30分钟来写一个简单的即时通讯的web app,前端用JS,服务端用Ruby。actioncable的外链:(https://github.com/rails/rails/tree/master/actioncable

这个应用的功能是这样的,打开网页,注册,或者已注册用户登录,新建聊天室,或进入已有的聊天室,同一个聊天室容纳多个人,一个聊天室内所有人会收到新的聊天信息的推送。

1. 建立应用,User建模,数据迁移

环境:Ruby Version: 2.3.3,Rails Version: 5.0.2

打开ternimal, cd到相关目录下,建立工程

先不写测试了,所以没有加入自带的测试框架

打开Gemfile

这个Device是用户认证用的,简化注册登录流程,外链:https://github.com/plataformatec/devise

bootstrap主要是样式,scss,面向对象的css,可以嵌套使用,而且默认提供了一部分组件样式。redis内存是数据库,应为instance message需要及时响应,mac上brew install redis,完成以后

增加scss样式表,同时删除原来的css

写入@import “bootstrap”;

User建模

增加约束,进入网站其他页面,必须是认证用户

写入

2. 聊天室

检查chat_room.rb,确认看到belongs_to :user
检查users.rb,确认看到has_many :chat_rooms, dependent: :destroy

聊天室需要一个标题,在用户登录以后,选择聊天室时可见,而且聊天室是由用户创建的,所以和创建他的用户绑定,如果创建他的用户被删除了,那么聊天室的内容也会被删除,类似于SQL中的DELETE CASCADE效果,完了记得映射model到数据库migrate操作。 继续阅读使用Rails5构建简单的IM