摄影师:ThisIsEngineering,连结:Pexels
哈啰,我们又见面了,今天我们来看看:「使用 Ruby on Rails
框架时,怎么开出前后端分离的 Web API
给前端做串接呢?」,切ki奥~
1. Ruby on Rails
框架的架构
首先简单介绍一下 Ruby on Rails
(简称 Rails
) 的架构,Rails
是一个实践 MVC Pattern
(Model-View-Controller Pattern) 的框架,对 MVC
不熟的捧油们可以参考 Model、View、Controller 三分天下 | 为你自己学 Ruby on Rails,也就是说 Model
(资料格式)、View
(显示资料)、Controller
(资料逻辑) 在 Rails
中,是会被强制分开来执行的,好处是各自分工明确,对于熟悉 MVC
架构的人来说,开发上不易混淆;坏处是对于不熟悉 MVC
架构的人来说,一开始就面对超多的资料夹根本是天书,如果你还没看过 Rails
的新专案长怎样,现在就让你看看:
只要一行指令,$ rails new {your-project-name}
,Rails
就会帮你把整个专案建好,就长上图的最左边这样,什么事都还没做,就已经一堆档案了,你如果没有先了解 MVC
是什么,看到这些档案一定相当傻眼。
我们把最常使用的资料夹拿出来看,就是 app/
和 config/
这两个资料夹,两个资料夹展开来,又是一堆档案,往 app/
资料夹里面仔细一看,会看到熟悉的名字: models
、views
、controllers
,但我们今天只会用到 app/controllers/events_controller.rb
和 config/routes.rb
这两个档案就够了。
2. 那什么是 Web API
呢?
讲到 Web API
就必须先讲到现代软体开发的趋势「前后端分离」,可以参考 [原来后端要知道] 什么是前后端分离? #前端后端是什么 #软体发展历程 #软体开发思维。
3. 所以该怎么在 Rails
开 Web API
呢?
对于笔者来说,认识一个新框架时,最重要的就是知道怎么利用框架来开 Web API
,至少能开出 GET
和 POST
两种,还要能收 request body 带进来的资料。
阿对了,在开始写 Rails
Web API
之前,你要先安装 Rails
和 建专案,可以参考 安装 Rails 开发环境 | Ruby on Rails 实战圣经 和 Rails 起步走 | Ruby on Rails 实战圣经。
3.1 在 config/routes.rb
新增两笔 routing 规则
Rails.application.routes.draw do# 开一个 GET /hello 的 API,并且对应到 EventController 的 index() methodget '/hello' => 'events#index'# 开一个 POST /hello 的 API,并且对应到 EventController 的 create() methodpost '/hello' => 'events#create'end
所以透过上面的设定,你就可以对 {your_host}/hello/
丢 request 啰,但我们现在还没有写下收到 request 之后的动作:=> 'events#index'
这段程式,就是告诉 Rails
说:「只要是 /hello
的 request 都去 events_controller.rb
的 index()
method 去找对应的动作」;同理,=> 'events#create'
这段就是要找 events_controller.rb
的 create()
method 啰,那么事不宜迟,我们马上来 events_controller.rb
,写下我们想要这两个 requests 要做的事。
3.2 在 app/controllers/events_controller.rb
新增 EventController
class 和 index()
、create()
methods
贴心提醒,这个
events_controller.rb
预设是不会自动产生的哦,需要自己建立这个档案。
class EventsController < ApplicationController# 这个 index() method,就是 GET 127.0.0.1:3000/hello/ 所对应到的动作# 我们可以在这里,把资料库的资料捞出来,并 response 回给使用者# 但目前我们只简单回个字串,做个 Hello World 即可 ~def index# response with json formatrespond_to do |format|format.json { render :json => { :status => "OK" }, status => 200 }endend# 这个 create() method,就是 POST 127.0.0.1:3000/hello/ 所对应到的动作# 这边示範把 POST request 内的 body 所夹带的资料拿出来,并且再 response 回给使用者def create# parse POST request body@content = JSON.parse(request.raw_post)['data']# 我待会儿会在 Postman 夹带叫做 data 的测试字串# response with json formatrespond_to do |format|format.json { render :json => { :status => "OK", :content => @content }, status => 200 }endendend
3.3 Rails
server 跑起来 !
在本地端做测试的话,可以直接执行下面这行
$ rails server
=> Booting Puma=> Rails 6.0.3.1 application starting in development => Run `rails server --help` for more startup optionsPuma starting in single mode...* Version 4.3.5 (ruby 2.6.3-p62), codename: Mysterious Traveller* Min threads: 5, max threads: 5* Environment: development* Listening on tcp://127.0.0.1:3000* Listening on tcp://[::1]:3000Use Ctrl-C to stop
在 Rails
中,预设是开 3000
ports,所以当你执行上面这行之后,就可以用浏览器到 127.0.0.1:3000/
看到 Rails
Hello World 的画面啰,但因为目前我们新增的是 Web API
,无法用浏览器来测试,所以我们需要借用到 Postman 帮我们丢 request。
4. 测试 Web API
有没有开成功 !?
先来测测 GET 127.0.0.1:3000/hello/
这支 API,如果你的 Rails
Web API
有开成功,就会得到你刚刚在 events_controller.rb
中 index()
method 的回应字串。
再来测测 POST 127.0.0.1:3000/hello/
,记得你的 request body 放什么名字(我这边叫做 data
),events_controller.rb
的 create()
method,就要跟着改(所以在 create()
的 JSON.parse
就要解析 data
)。
总结
接触一个新框架后,先写一支传接资料的 Web API
,已经变成笔者的习惯,就像是学新语言都要先印出 Hello World 一样,不写不能安心 XD。
笔者目前因为工作的关係,现在开始学习 Ruby on Rails
,之后可以期待更多的 Rails
文章和后端文章啰 ~ (希望之后下班后还能有精神继续写作哈哈)
我是 RS,这是我的 不做怎么知道系列 文章,我们 下次见。
喜欢我的文章吗? 赶快来看看我都发了什么文章吧:我的文章目录欢迎阅读我的上一篇: [我所不知道的技术细节] 如何保障你辛苦写的程式码? #opensource #license #github欢迎阅读我的下一篇: 待续