使用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

iOS集成Braintree, 支持credit card, PayPal支付(sandbox环境)

如果客户端只支持Paypal,那么需要import PayPal Mobile SDKs,但在v.zero以后(https://developer.paypal.com/docs/bt-vzero-overview/),可以集成多种支付,不需要分别import各自的SDK,就像是统一了行业标准,对开发者来说是件好事情,而且如果使用drop-in SDK自带的UI,开发起来会很省心,不需要自己写界面,一个底部弹出框包含所有支付内容。所以,趁我还没酒精过量,赶快写下v.zero的工作原理,还有Server和Client联调的demo。

看到官方文档(https://developers.braintreepayments.com/start/overview),首先先讲两个重要的点:1.Client token,2.Payment method nonce

Client token

是服务端通过Braintree的SDK生成的,比如我要用Rails5来开发,服务端,那么我需要的SDK是(gem “braintree”, “~> 2.72.0”),用它来生成token
这三个参数是生成token的依据,当你注册一个新的账户(https://www.braintreepayments.com/en-ca/sandbox)
给下截图,Account->My User->View Authorizations->API Keys->view,注意那三个参数,mark等下server会用到。


Rails配置代码:

记下以后继续,然后客户端会依据这个client token直接和Braintree的服务器通信,所以这是一个认证令牌(These should not be reused; a new client token should be generated for each request that’s sent to Braintree.)而且为了安全,每次客户端和Braintree服务器的直接通信都需要新的token,对应于每一个支付request。就像APNs当中,注册token,然后拿着token直接和apple服务器通信,一个道理,只不过一个是OS级别的,一个是第三方服务,那OS级别的无非是依赖于Apple ID这个统一的账户系统,本质是一样的对吧。

Payment method nonce
直接翻译叫做:支付方法随机数。其实就是一个字符串,代表一次支付方法的调用,然后服务端,获取这个字符串,通过Server的SDK,对Braintree服务器发起新的事务请求
这个东西其实在客户端的callback方法中有,是Braintree服务器直接下发的,我们的服务器不管这个类型。附上解释原理的那张经典图片:

看下overview的文档,图片下的5个steps,讲得很清楚
以上原理,现在到实践 继续阅读iOS集成Braintree, 支持credit card, PayPal支付(sandbox环境)

制作并发布自己的Gem

我要写一个demo小工具来记录gem的开发过程,

工具的作用:遍历本地的git仓库,并且更新它们到最新的代码,也就是每个仓库进行git pull操作,很简单吧,demo就是要简单嘛

mac下的gem开发环境:

ruby –version, 2.2.2
gem –version, 2.6.1
bundle –version, 1.11.2
rake –version, 10.4.2

屏幕快照 2016-03-27 下午8.30.41

继续阅读制作并发布自己的Gem