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

客户端Mock服务端的JSON数据

场景1:服务端和客户端已经制定了JSON数据的格式,但是数据组还没能给出真实数据,客户端的开发走服务端前面
场景2:客户端工程师已经完成story,而服务端数据一直不正常,影响测试,要在后期接口才能ready

这个时候,我们需要mock服务端的JSON数据,然后方法有很多,比如:
1.自己在本地架起服务器,手动写入一批JSON数据,在客户端工程中把请求路径改为本地
2.使用第三方的服务,比如Mocky,但是如果不能科学上网的话,数据返回很慢

既然mocky是开源的,我们在自己的服务器上搭建呗,我就是来讲下怎么搭建的,不会写scala没关系,不就搭个服务么,哈哈

首先我的环境是centOS6.5,Linode的主机,ip在新加波,没有用国内的云服务的原因很简单,有些请求拿不到数据,总之就是不能科学上网。如果没有自己海外的主机,去买一个吧,一个月也就10刀的样子。 继续阅读客户端Mock服务端的JSON数据

Github上fork流程的小结

情况1:
从一个开源的版本库,fork出来,到自己的repositories,然后clone到本地,
我在develop分支上开发新功能,新建一个分支feature/XXX,其他人没有提交PR,我提交以后,maintainer批准通过,我在终端git pull upstream develop 这样本地就sync到最新的代码,最后git push origin develop 把本地最新的develop分支推到我自己的origin上的develop分支。
完成一次迭代,开始下一轮
情况2:
前提同上,我提交以后,有同事做了修改,发了PR,并且已经通过,当我要发PR的时候,upstream上有新的commit,那么我要先切换到本地develop分支,git pull develop upstream从源库拉最新的develop代码到本地,然后切换到feature/XXX分支,接着git rebase develop,重定义feature/XXX分支的base为最新的develop分支,在这里可能会发生rebase冲突,vi到冲突的patch文件,解决冲突,然后git add -u更新文件索引,就回到情况1的状态了。
小技巧:

fork后,如果需要快速获取和切换到他人的pr的话,在.git/config里的upstream添加:
fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*
git fetch upsteam后可以直接用命令如: git co upstream/pr/871来切换到他人的pr上了。如果co没有反应,配置,co 映射到checkout 命令

 

CentOS6 yum安装 MongoDB

先yum search mongodb 看下有没有相关的源,如果你和我一样用的是linode那么默认的是没有的,要自己配置。所以我们要增加yum源:

然后加入下面写配置信息:

好了现在yum search mongodb 会有两个包,然后安装他们:

最后启动:

 

CentOS6 PPTP VPN 配置(支持32bit,64bit)

然后保存文件为pptpd6.sh,运行脚本即可,最后会给出vpn的帐号和随机生成的密码,端口是默认的1723

 

Linux命令行文件传输

SCP:基于SSH安全协议的文件传输命令,只提供文件传输功能,没有文件管理功能
复制localFile到host的remoteFolder文件目录下:

复制localFolder到host的remoteFolder(-r是递归)

PS:把参数交换以后是从remote到本地的反向传输